请考虑以下代码:
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
。然后,应将此促销值分配给左值x
,从而生成x == 255
。
但显然我不能正确理解这一点。我错过了什么?
答案 0 :(得分:7)
整体促销是在一元~
的操作数上执行的,因此uint8_t(0)
会提升为int
,然后评估~
。它相当于
~(int)(uint8_t)0
您可以使用std::numeric_limits<T>::max()
获取可通过类型表示的最大值;如果类型是无符号的,您还可以将-1
强制转换为该类型:
uint32_t x = (uint8_t)-1;
答案 1 :(得分:2)
在您的示例中,按位非运算符(~
)在执行之前将其操作数提升为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