最近在项目中需要做一个算术运算比较问题,涉及到一个比较的溢出问题。可以简单的抽象成一个示例如下:
int a = -100;
unsigned b = 100;
if (a < b) {
cout << "a(-100) < b(100)" << endl;
}
else {
cout << "a(-100) > b(100)" << endl;
}
在我的mac机器上的运行结果如下:
结果有些出乎意料:居然是-100 > +100。
正常情况下,这个错误可能比较不太容易发现,因为这里被编绎器进行算法比较的时候,进行隐式类型转换,会将他们转换成相同的类型进行比较。转换的原则是,从低类型转成高类型:
char,shor -> int -> unsigned -> long -> double, float -> double
这个示例中,是一个int和一个unsigned int的比较,那自然是int 类型的-100转换成unsigned int类型,那此时是溢出,unsigned int 无法表示一个负值,那它在我的mac机器上的值是4294967196(并不是所有编绎器都这样,这个不是C++标准,是编绎器自己实现的行为),所以最后结果是a(-100)转换成了unsigned int值为4294967196,最终有-100 > 100的结果,导致判断并非开发者所愿。
简单总结:特别是在开发过程中,要注意这些细微处的类型问题,否则就可能在看似正常的代码下,跑出异常逻辑,而且特别不容易通过阅读代码定位!另外推荐阅读陈皓老师的那篇整数溢出的文章,我这里是对那篇的一点补充(C语言的整型溢出问题)