operator <<如果结果是unsigned int或unsigned short则解释算术运算

axe*_*xel 6 c++ unsigned short

我在fedora 19 64bits下使用gcc 4.8.3

unsigned u1=10, u2=42;
unsigned short us1=10, us2=42;

int main() {
   cout << "u1-u2="<<u1-u2<<", us1-us2="<<us1-us2<<endl;
}
Run Code Online (Sandbox Code Playgroud)

结果:u1-u2 = 4294967264,us1-us2 = -32

<<运算符似乎将第二个操作的结果解释为带符号的 short,而它将第一个操作的结果解释为unsigned int

M.M*_*M.M 5

作为-大多数其他算术运算符的操作数,整数类型的任何值都比int提升的更窄int.

所以us1 - us2表现得像(int)us1 - (int)us2.

这条规则在现代C++中非常烦人,但它最早出现在C语言中(因为int大小的寄存器用于算术运算),它现在会破坏太多代码来改变它.