存储32位有符号整数到寄存器的具体细节是什么?
存储32位有符号整数到寄存器的具体细节是什么?
我的数字类型是有符号的补码整数。
在内存寄存器%rdi/edi/di中,我有0xFFFFFFFF。
在%rsi/esi/si中,我有0x80000000。
我的指令是addl %edi, %esi
。
如何正确相加这些数?
我想答案是:
由于我正在相加完整的32位寄存器,我有添加0xFFFFFFFF和0x80000000的好处。
所以,我有一个有符号整数加上一个有符号整数,并且它们都是32位的。我实际上是在相加-2147483648和0x80000000。由于0x80000000在十六进制中是2147483648,我将这两个数相加得到零。
零标志位被激活。
进位标志位被激活(因为我正在相加32位寄存器的最高位值)。
在32位二进制补码表示中,0xFFFFFFFF
表示-1,0x80000000
表示-2,147,483,648。这两个数的和是-2,147,483,649。这个结果无法在32位中存储,因此会发生溢出。计算得出的结果是0x7FFFFFFF
,表示2,147,483,647。
在位级上:FFFFFFFF
加上80000000
得到17FFFFFFF
,这意味着32位目标寄存器中存储的是7FFFFFFF
,而1
是一个进位。
啊,好的,我算错了。谢谢你的纠正。
问题:由于有一个“进位”,那么它是不是表示为:1x7FFFFFFF?
_Senate: 32位寄存器没有第33位。它不会放在目标寄存器中。进位位会被设置在标志寄存器中。“1x7FFFFFFF”不是常用的表示法。在“0x12345678”中的“0”并不代表一个零位,它是C语言历史发展所强制的表示法。如果事情发展得不同,我们可以使用“hex 12345678”。
“不常用”意味着它被使用过,所以如果我理解正确,“0”是一个标志而不是位?这是否意味着我们讨论的这个计算有一个CF标志和一个OF标志?
_Senate: 我不知道它在任何地方被使用过。不,这个“0”不是一个标志。他们只是想要在C语言中使用十六进制常量,而不能以字母开头,因为以字母开头的任何内容都已经是一个标识符,所以必须以数字或特殊字符开头,而且他们可能不想使用特殊字符。它不能只有数字,因为十进制数已经使用了那些数字。所以他们需要一个数字和其他东西。我想有人建议使用“0x”,然后就一直沿用下来了。它除了表示“这是一个十六进制数”之外,并没有其他意义。