将32位带符号整数存储到寄存器中的细节是什么?

时间:2018-10-20 13:42:50

标签: assembly x86 integer-overflow twos-complement signed-integer

我的数字类型是带符号的两个补码整数。

在内存寄存器%rdi / edi / di中,我有0xFFFFFFFF。 在%rsi / esi / si中,我有0x80000000。

我的指令是addl %edi, %esi

如何正确添加这些?

我认为答案是:

由于我要添加完整的32位寄存器,所以我的好处是可以添加完整的0xFFFFFFFF和0x80000000。

因此,我将有符号整数添加到有符号整数,它们都是32位。我实际上是添加-2147483648和0x80000000。由于0x80000000的十六进制值为2147483648,因此我将这两个值相加得到零。

零标志被激活 进位标志被激活(因为我要添加32位寄存器的前导值)

1 个答案:

答案 0 :(得分:4)

在32位二进制补码中,0xFFFFFFFF表示-1,而0x80000000表示−2,147,483,648。这些之和为-2,147,483,649。不能容纳32位,因此会溢出。计算结果将为0x7FFFFFFF,代表2,147,483,647。

在位级别:FFFFFFFF80000000产生17FFFFFFF,这意味着7FFFFFFF存储在32位目标中,而1是一个进位。