gpt4 book ai didi

c - 为什么最小可能整数的否定会产生自身?

转载 作者:太空宇宙 更新时间:2023-11-04 06:16:21 25 4
gpt4 key购买 nike

所以我写了一个测试下溢和上溢的小实验,使用 c 和一台 64 位机器。对于 int 类型,最小/最大值为:

   int tmax = 2147483647;
int tmin = -2147483648;

我知道补码是如何工作的,这不是我的问题。

所以我想,如果我做一些负 tmin 会发生什么?即:

   int tmin = -2147483648;
int negativeTmin = -tmin;

它最终还是 tmin。 (也就是说,negativeTmin 将为 -2147483648)

我的问题是为什么会这样?既然正数 2,147,483,648 不能用 int 表示,我当然理解为什么不是这样,但奇怪的是它根本没有改变使它成为唯一在应用 - 时不会改变的非零整数。我并不是说我对它应该是什么有了更好的了解,我只是好奇为什么 -tmin == tmin。它是否与按位运算有关,或者减法在计算机中是如何完成的,或者它默认这样做是因为我试图做的事情是未定义的,还是其他原因?

我的代码:

#include <stdio.h>
int main() {
int tmax = 2147483647;
printf("tmax Before: %d\n", tmax);
tmax++;
printf("tmax After: %d\n\n", tmax);

int tmin = -2147483648;
printf("tmin Before: %d\n", tmin);
tmin--;
printf("tmin After: %d\n\n", tmin);

int tmin2 = -2147483648;
int negativeTmin = -tmin2;
printf("negative tmin: %d\n\n", negativeTmin);

return 0;
}

输出:

tmax Before: 2147483647 tmax After: -2147483648

tmin Before: -2147483648 tmin After: 2147483647

negative tmin: -2147483648

最佳答案

正如其他人在此处发布的那样,从技术上讲,您正在做的事情会导致未定义的行为,因为 C 中有符号整数的上溢或下溢会导致未定义的行为。

另一方面,在大多数 Intel 系统上,整数上溢或下溢只是环绕整数值并设置一些处理器标志,以便以后的指令可以检测到溢出。在这些系统上,有理由问 - 为什么 在计算 -Tmin 时得到 Tmin

在带符号的二进制补码系统中,需要注意表达式 -x相当于~x + 1 .假设您有 Tmin,如下所示:

10000000 00000000 00000000 00000000

如果你计算 ~Tmin,你会得到

01111111 11111111 11111111 11111111

这恰好是 Tmax。如果你加一个,你会得到一个巨大的纹波进位,一直传播到最后,屈服

10000000 00000000 00000000 00000000

这就是我们的出发点。这就是为什么您可能会看到 Tmin 回来的原因。

另一种理解方式:您知道有符号 32 位整数的 Tmin 是 -231。 -Tmin 的值应满足 Tmin + -Tmin = 0 (mod 232 )。那么 [-231, 231 - 1] 范围内的哪个值恰好具有此属性?它是 -231,这就是为什么 Tmin = -Tmin

因此,您问题的最佳答案可能是“从技术上讲,您正在做的是未定义的行为,但在合理的英特尔系统和未设置为进行积极优化的编译器上,它归结为如何带符号的 32 位整数算法的工作原理以及如何定义否定。”

关于c - 为什么最小可能整数的否定会产生自身?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45089640/

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