2

在我的limits.h中,有符号长整数的限制为 - 定义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

注意 - 代码来自“Learn C the hard way”

4

2 回答 2

2

因为中间结果之一溢出,这在技术上会导致未定义的行为。

为避免这种情况,也许在可以保存中间结果的类型中进行计算,例如 unsigned long ( UL) 或 long long ( LL)。

于 2013-03-11T09:29:59.413 回答
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它可以再次适合 along之后。

于 2013-03-11T09:36:10.197 回答