gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 16:01:08 36 4
gpt4 key购买 nike

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

36 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com