考虑以下代码:

 uint32_t x = ~uint8_t(0);
 std::cout << x << std::endl;

现在,我完全期望这会输出 255, ,而是输出 4294967295.

我知道C ++中的整数促销,但我不明白为什么会发生这种情况。我理解的方式,表达 ~uint8_t(0) 应该评估 1111 1111 在二进制中。这 ~ 然后,操作员将导致该类型被提升为 int (出于讨论的目的,我认为这是32位),通过将值扩展到 0000 0000 0000 0000 0000 0000 1111 1111. 。然后应将此促进价值分配给LVALUE x, , 导致 x == 255.

但是显然我没有正确理解这一点。我想念什么?

有帮助吗?

解决方案

整体促销是在一元的操作数上进行的 ~, , 所以 uint8_t(0) 被提升为 int 然后 ~ 被评估。等同于

~(int)(uint8_t)0

您可以通过使用类型来获得最大值 std::numeric_limits<T>::max();如果类型未签名,您也可以施放 -1 对此类型:

uint32_t x = (uint8_t)-1;

其他提示

在您的示例中,位不是操作员(~)正在将其操作数推广到 int 在执行之前。然后将其转换为 unsigned int 通过作业。

以下是一些相关的代码示例,可以更清楚:

uint8_t y = ~uint8_t(0);
uint32_t x = y;
std::cout << x << std::endl;

255

uint8_t y = uint8_t(0);
int z = ~y;
uint32_t x = z;
std::cout << x << std::endl;

4294967295

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top