将较小整数的最大值分配给较大的整数

时间:2010-11-01 22:27:46

标签: c++ integer ones-complement

请考虑以下代码:

 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

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

2 个答案:

答案 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