带符号类型和无符号类型
题目:
unsigned u = 10, u2 = 42;
cout << "u - u2: " << u - u2 << endl;
cout << "u2 - u: " << u2 - u << endl;
int i = 10, i2 = 42;
cout << "i - i2: " << i - i2 << endl;
cout << "i - u2: " << i - u2 << endl;
cout << "u - i2: " << u - i2 << endl;
double d = 10.0, d2 = 42.0;
cout << "d - d2: " << d - d2 << endl;
cout << "d - u2: " << d - u2 << endl;
cout << "u - d2: " << u - d2 << endl;
输出:
分析:
-
u - u2
属于无符号数之间的减法,无符号数字做减法,一定要确保结果非负数,否则会输出取模后的值. 一个经典死循环:for (unsigned u = 10; u >=0; --u) std::cout << u <<std::endl;
-
当算术表达式中,既有无符号数值又有int值时,int值被转换为无符号数。具体转换的数值根据对应计算机环境中int的占位数。
-
double 类型和unsigned类型做运算,unsigned类型会转换为double类型
结论:
- 切勿混合使用带符号类型和无符号类型
- 避免无法预知和依赖实现环境的行为,也就是所谓的不可移植性