c - 为什么 "INT_MAX * INT_MAX"乘积给1?

标签 c cpu-architecture integer-overflow

我正在学习计算机体系结构,并决定尝试乘法溢出。观察到 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 * intundefined 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/

相关文章:

c - 随机化在c中打印什么字符串

c++ - 检测 CPU 架构编译时

java - 为什么这个乘法整数溢出会导致零?

java - 如何摆脱这个溢出错误?

c - fork、pipe exec 和 dub2

c - 分配大小为 char * 的内存有什么作用?

assembly - 缓存操作是原子的吗?

c - 结构大小优化

Opencv Mat乘以常量运算保护溢出?

c - 为什么 getchar 调用 printf 停止工作?