在我的limits.h中,签名长的限制为 - define LONG_MAX 2147483647L
但是,以下代码行会导致“表达式中的整数溢出”的警告 但程序运行文件并产生预期值。
long universe_of_defects = 1L * 1024L * 1024L * 1024L * 2L - 1L;
printf("The entire universe has %ld bugs.\n", universe_of_defects);
印刷的价值是 - 2147483647
那么这个警告的原因是什么以及如何解决? 我有GCC - gcc(Ubuntu / Linaro 4.4.4-14ubuntu5)4.4.5
注意 - 代码来自“以艰难的方式学习C”
答案 0 :(得分:2)
因为其中一个中间结果溢出,这在技术上会导致未定义的行为。
为了避免这种情况,也许在可以保存中间结果的类型中进行计算,例如:无符号长(UL
)或长(LL
)。
答案 1 :(得分:2)
该计算的第一部分溢出:
1L * 1024L * 1024L * 1024L * 2L - 1L
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// 2,147,483,648 > 2,147,483,647 It's too late!
// Overflow occurs previous value is overflowed
尝试
long universe_of_defects = 1LL * 1024 * 1024 * 1024 * 2 - 1;
LL
将值提升为long long
类型,然后在-1
之后它再次适合long
。