Sid*_*oor 2 c integer-overflow cpu-architecture
我正在学习计算机体系结构,并决定尝试乘法溢出。观察到 的溢出INT_MAX * INT_MAX,但我不确定为什么这会在 C/C++ 中给出乘积 1。
#include <stdio.h>
#include <limits.h>
int main()
{
int num = INT_MAX;
printf("%0x\n", num); //stdout is 0x7fffffff
printf("%d\n", num * num); //stdout is 1
return 0;
}
Run Code Online (Sandbox Code Playgroud)
注意:您的代码无效。溢出int*int是未定义的行为,您不应该编写此类代码。结果将是不可预测的。这是一个玩具示例,其中编译器选择以特定方式执行操作 - 但通常,编译器可以对您的代码执行任何操作。如果您希望定义有符号溢出,请参阅示例,当使用 -fwrapv 时,有符号溢出在 gcc 中仍然是未定义的行为吗?。
例如,假设int您的平台有 32 位并且是二进制补码。计算结果,然后截断为 32 位。
INT_MAX = 0x7fffffff = 2147483647
2147483647 * 2147483647 = 4611686014132420609
4611686014132420609 = 0x3fffffff00000001
32-bits from 0x3fffffff00000001 = 0x00000001 = 1
Run Code Online (Sandbox Code Playgroud)