【发布时间】:2016-07-14 21:09:54
【问题描述】:
有符号整数在 x86 上通过二进制补码表示,其中符号位的值 -(2^N)。这导致在-2^N 和2^N - 1 之间的典型可表示值范围(例如-32768 到32767)。
我很好奇如果我将系统上的最小有符号整数值乘以-1 以试图“强制”一个最大值大于我系统上有符号整数的最大可表示值会发生什么。
#include <stdio.h>
#include <limits.h>
int main(void){
signed int x, y;
x = INT_MIN;
y = x * -1;
printf("%d\n%d\n", x, y);
return 0;
}
这导致以下输出:
# gcc -std=c89 -pedantic int_min_test.c
# ./a.out
-2147483648
-2147483648
我期待整数溢出(导致典型值翻转),但似乎没有发生关于 x 与 -1 相乘的操作。
INT_MIN 与 -1 的乘积在 x86 中是无操作的吗?
【问题讨论】:
-
翻转不会再次精确地产生最小的可能值吗?
-
这是未定义的行为(对于 2 的补码) - 与 x86 无关。
-
@KerrekSB 所说的。如果你想在没有 UB 的情况下观察这一点,只需使用无符号类型。
-
它完全包装,它只是包装到您开始使用的值。没有证据表明没有溢出。
标签: x86 undefined-behavior signed integer-overflow