C++primer里的原话:
"如果一个运算对象是无符号类型,另外一个运算对象是带符号类型,而且其中的无符号类型不小于带符号类型,那么带符号的运算对象转换成无符号的。"
实验代码:
int a = -5;
unsigned c = 3; //这里unsigned有4个字节,感觉就相当于unsigned int了
unsigned char d = 3;
cout << sizeof(a)<<" "<<sizeof(c)<<endl<<a + c << endl;
cout << sizeof(a) << " " << sizeof(d) << endl << a + d << endl;
实验结果:
4 4
4294967294
4 1
-2
分析:因为两个数做运算时,小的整形类型首先提升为较大的整数类型,推测可能标准制定委员会认为unsigned int比int宽了一个符号位,所以把int提升成了unsigned int,但是unsigned char只有1字节,所以提升成int。
当然,可以去看一下《C++primer》的P142页最后一段,讲的挺透彻的。