我正在学习计算机体系结构,并决定尝试乘法溢出。观察到 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;
}
最佳答案
注意:您的代码无效。溢出 int
* int
是 undefined behavior ,并且您不应该编写这样的代码。结果将不可预测。这是一个玩具示例,其中编译器选择以特定方式运行 - 但通常,允许编译器对您的代码执行任何操作。如果要定义有符号溢出,请参见示例 Is signed overflow still undefined behaviour in gcc when -fwrapv is used? .
例如,假设您平台上的 int
有 32 位并且是 twos-complement .计算结果,然后截断为 32 位。
INT_MAX = 0x7fffffff = 2147483647
2147483647 * 2147483647 = 4611686014132420609
4611686014132420609 = 0x3fffffff00000001
32-bits from 0x3fffffff00000001 = 0x00000001 = 1
关于c - 为什么 "INT_MAX * INT_MAX"乘积给1?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70666955/