int sum;
int N 表示的最大数是 2^0 + 2^1 + ... + 2^(sizeof(int)*8-1)。如果我设置 sum = N + N 会发生什么?我对编程有点陌生,所以你是新手。
int sum;
int N 表示的最大数是 2^0 + 2^1 + ... + 2^(sizeof(int)*8-1)。如果我设置 sum = N + N 会发生什么?我对编程有点陌生,所以你是新手。
如果加法的结果超出了( .. )int
中可以表示的值的范围,则存在溢出。int
INT_MIN
INT_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
你会有一个整数溢出,因为这个数字太大了,int
如果你想这样做,你必须将它声明为long
希望这可以帮助