整形溢出的总结

70 篇文章 0 订阅
37 篇文章 0 订阅

最近在项目中需要做一个算术运算比较问题,涉及到一个比较的溢出问题。可以简单的抽象成一个示例如下:

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语言的整型溢出问题

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值