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.
但显然我并没有正确理解这一点.我错过了什么?
整数提升是在一元的操作数上执行的~,因此将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)