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

Cha*_*l72 2 c++ integer ones-complement

请考虑以下代码:

 uint32_t x = ~uint8_t(0);
 std::cout << x << std::endl;
Run Code Online (Sandbox Code Playgroud)

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

我知道C++中的整数提升,但我不明白为什么会这样.我理解它的方式,表达式~uint8_t(0)应该以1111 1111二进制形式进行评估.然后,~操作符将使类型被提升为int(为了讨论,我将假设为32位),通过符号将值扩展为0000 0000 0000 0000 0000 0000 1111 1111.然后应将此提升的值分配给左值x,从而产生x == 255.

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

Jam*_*lis 7

整数提升是在一元的操作数上执行的~,因此将uint8_t(0)其提升为int然后~进行评估.它相当于

~(int)(uint8_t)0
Run Code Online (Sandbox Code Playgroud)

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

uint32_t x = (uint8_t)-1;
Run Code Online (Sandbox Code Playgroud)