将较小整数的最大值分配给较大的整数
-
28-09-2019 - |
题
考虑以下代码:
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
不隶属于 StackOverflow