我有一个简单的程序。请注意,我使用了一个大小为 1 字节的无符号固定宽度整数。
#include <cstdint>
#include <iostream>
#include <limits>
int main()
{
uint8_t x = 12;
std::cout << (x << 1) << '\n';
std::cout << ~x;
std::cin.clear();
std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
std::cin.get();
return 0;
}
我的输出如下。
24
-13
我测试了更大的数字,操作员<<
总是给我正数,而操作员~
总是给我负数。然后我用sizeof()
了,发现...
当我使用左移位运算符(
<<
)时,我收到一个无符号的 4 字节整数。当我使用按位非运算符(
~
)时,我收到一个有符号的 4 字节整数。
似乎按位非运算符(~
)像算术运算符一样进行有符号整数提升。然而,左移运算符 ( <<
) 似乎提升为无符号积分。
我觉得有义务知道编译器何时在我背后改变了一些东西。如果我的分析是正确的,所有按位运算符是否都提升为 4 字节整数?为什么有些签名有些未签名?我很混乱!
编辑:我总是得到积极或总是得到负值的假设是错误的。但是由于错误,我了解了真正发生的事情,这要归功于下面的精彩答案。