我在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;
}
结果: u1-u2 = 4294967264,us1-us2 = -32
&lt;&lt;运算符似乎将第二个操作的结果解释为签名短 而它将第一个操作的结果解释为 unsigned int
答案 0 :(得分:5)
作为-
和大多数其他算术运算符的操作数,任何比int
窄的整数类型值都会提升为int
。
所以us1 - us2
表现为(int)us1 - (int)us2
。
这条规则在现代C ++中非常烦人,但它最早出现在C语言中(因为int大小的寄存器用于算术运算),它现在会破坏太多代码来改变它。