【发布时间】:2017-12-18 18:26:12
【问题描述】:
所以我写了一个小实验测试下溢和上溢,使用 c 和 64 位机器。对于 int 类型,最小/最大值是:
int tmax = 2147483647;
int tmin = -2147483648;
我知道二进制补码是如何工作的,这不是我的问题。
所以我想,如果我做了一些负 tmin 会发生什么?那就是:
int tmin = -2147483648;
int negativeTmin = -tmin;
它最终仍然是 tmin。 (也就是说,negativeTmin 将是 -2147483648)
我的问题是为什么会这样? 因为正数 2,147,483,648 不能用 int 表示,所以我理解为什么当然不是这样,但它根本没有改变似乎很奇怪使它成为唯一一个在应用 - 时不会改变的非零 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 之前:2147483647 tmax 之后:-2147483648
tmin 之前:-2147483648 tmin 之后:2147483647
负 tmin:-2147483648
【问题讨论】:
-
您的“实验”涉及未定义的行为(有符号溢出有一个)。所以从 C 的角度来看,推理它有一点价值。
-
您说您了解补码 2 表示。你确定吗?这是 tmin==-tmin 的解释。为方便起见,请在 8 位中仔细考虑。
-
你为什么不使用来自
limits.h的INT_MAX和INT_MIN? -
Eugene Sh:我明白了。 Yunnosch:是的,在发布这个问题后不久,我就想到了你在说什么(下)。然而,这不是正确的解决方案,相反我被告知它是未定义的,因为不能保证所有机器的 tmin == -tmin。 David Bowling:因为我想你可以这么说,因为我想弄乱他们“原始”形式的限制。
-
您系统上的 INT_MAX 和 INT_MIN 是什么?非常相关的信息。另请确认您使用的是 C99 或更高版本(如果您有 32 位整数,
-2147483648的行为在 C90 和 C99 之间发生了变化)
标签: c integer storage min twos-complement