gpt4 book ai didi

x86 - INT_MIN * -1 在 x86 上是无操作吗?

转载 作者:行者123 更新时间:2023-12-01 16:14:42 24 4
gpt4 key购买 nike

有符号整数在 x86 上通过二进制补码表示,其中符号位的值为 -(2^N)。这会产生 -2^N2^N - 1 之间的典型可表示值范围(例如 -3276832767)。

我很好奇,如果我将系统上的最小有符号整数值乘以 -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 中是无操作吗?

最佳答案

使用 gcc 4.8.5,行 y = x * -1; 使用以下指令计算:

neg    %eax

取反运算翻转字的位,然后加 1。对于 32 位 2 的补码,结果为:

0x80000000 # Start value
0x7FFFFFFF # Flip bits
0x80000000 # Add 1

如您所见,计算机正在完全按照您的指示进行操作。这不是一个空操作,因为 neg 修改了 AFCFOFPF SFZF 标志。它只是所使用的二进制表示的产物。正如其他人所说,这只是未定义的行为。

关于x86 - INT_MIN * -1 在 x86 上是无操作吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38384313/

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