2

考虑以下代码:

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

现在,我完全期望它输出255,但它输出4294967295

我知道 C++ 中的整数提升,但我不明白为什么会发生这种情况。我理解它的方式,表达式~uint8_t(0)应该以1111 1111二进制计算。然后,~运算符将int通过符号将值扩展为0000 0000 0000 0000 0000 0000 1111 1111. 然后应该将此提升的值分配给左值x,从而产生x == 255.

但显然我没有正确理解这一点。我错过了什么?

4

2 回答 2

7

积分提升是在一元的操作数上执行的~,所以uint8_t(0)被提升到int然后~被评估。相当于

~(int)(uint8_t)0

std::numeric_limits<T>::max()您可以使用;获得类型可表示的最大值 如果类型是无符号的,您也可以强制-1转换为该类型:

uint32_t x = (uint8_t)-1;
于 2010-11-01T22:29:58.850 回答
2

在您的示例中,按位非运算符 ( )在执行之前将~其操作数提升为 an 。int然后unsigned int通过分配将其转换为an。

以下是一些相关的代码示例,可以更清楚地说明这一点:

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

于 2010-11-01T22:35:20.340 回答