LeetCode中C++整数溢出问题:long为何失效及优雅解法问询
问题原因与解决方法
为什么long c = a+1;和long d = (long)(a+1);会失效?
核心原因是运算优先级与类型提升规则:
a是int类型,a+1的两个操作数均为int,因此整个加法运算会在int的数值范围内执行。当a取int最大值时,a+1直接触发整数溢出,生成错误的int值(即你看到的-2147483648)。- 不管是把这个溢出后的错误值赋值给
long,还是对溢出结果做强制转换,都只是将已出错的int值扩展为long类型,无法修复溢出导致的数值错误。
更简洁的解决方法
只需提前将int类型的a转换为long,再执行加法操作,就能让运算在long的范围内进行,彻底避免溢出:
int a = (1 << 31) - 1; // 方法1:C风格强制转换 long c = (long)a + 1; // 方法2:C++推荐的static_cast类型转换 long d = static_cast<long>(a) + 1; cout << "c = " << c << endl; cout << "d = " << d << endl; >>> c = 2147483648 >>> d = 2147483648
这里a先被提升为long类型,+1的运算会以long的精度执行,自然不会触发溢出问题。
内容的提问来源于stack exchange,提问作者x86_64
相关产品推荐
相关产品推荐

