0
int sum; 

int N 表示的最大数是 2^0 + 2^1 + ... + 2^(sizeof(int)*8-1)。如果我设置 sum = N + N 会发生什么?我对编程有点陌生,所以你是新手。

4

2 回答 2

4

如果加法的结果超出了( .. )int中可以表示的值的范围,则存在溢出intINT_MININT_MAX

对于有符号整数类型,整数溢出的行为是未定义的。

在许多实现中,您通常会得到与忽略数学结果的低位 N 位(其中 N 是 an 中的位数int)以外的所有结果一致的结果——但语言不保证这一点。

此外,允许编译器假设您的代码的行为已定义,并基于该假设执行优化。

例如,使用 clang++ 3.0,这个程序:

#include <climits>
#include <iostream>

int max() { return INT_MAX; }

int main()
{
    int x = max();
    int y = x + 1;
    if (x < y) {
        std::cout << x << " < " << y << "\n";
    }
}

编译时不打印任何内容-O0,但打印

2147483647 < -2147483648

使用-O1或更高版本编译时。

总结:不要那样做。

(顺便说一下,类型的最大可表示值int更简单地表示为 2 N-1 -1,其中 N 是类型的位宽度int- 或者更简单地表示为INT_MAX。对于具有 32 位 的典型系统int,即 2 31 -1 或2147483647。您还假设它sizeof以 8 位为单位;实际上它以位为单位,CHAR_BIT其中至少为8,但可以(很少)更大。)CHAR_BIT

于 2013-11-04T18:32:28.483 回答
0

你会有一个整数溢出,因为这个数字太大了,int如果你想这样做,你必须将它声明为long

希望这可以帮助

于 2013-11-04T18:30:22.020 回答