我目前正试图弄清楚如何从二进制补码十六进制到其基数为10的正确转换。我们得到了一个汇编语言程序,它可以添加和减去32位整数,并需要获取寄存器的值并进行转换。
这是我尝试过的,然而,我的教授说我在最后的计算中犯了一个严重错误,我不知道是什么。
这是寄存器EAX值:FFFC0888
然后我将它从二进制补码十六进制转换为十六进制: FFFC0888 - > 0003F778
最后将十六进制转换为十进制。 0003F778 =(0 X 16 ^ 7)+(0 X 16 ^ 6)+(0 X 16 ^ 5)+(3 X 16 ^ 4)+(15 X 16 ^ 3)+(7 X 16 ^ 2)+ (7 X 16 ^ 1)+(8 X 16 ^ 0)= 0 + 0 + 0 + 196608 + 61440 + 1792 + 112 + 8 = 259960
我对259960的最终答案是不正确的,有人可以帮我启发一下我做错了什么吗?谢谢!
答案 0 :(得分:1)
(@ chathux暗示答案)。
您的值为X == FFFC0888_16。当您将X转换为0003F778时(通过"二进制补码"),您这样做是因为您(应该)认为X值是"否定" (符号位置位)。您生成的十进制值259960是正确的幅度,即abs(X)== 259960_10。但是X的值是负的,所以正确的答案是X == -259960_10。
如果X == 7FFC0888_16的值为正值(符号位为零),则在生成小数值之前不应该使用二进制补码。
答案 1 :(得分:1)
转换中的所有内容都是正确的,但以下情况除外:
0003F778 = -(0 + 0 + 0 + (3 X 16^4) + (15 X 16^3) + (7 X 16^2) + (7 X 16^1) + (8 X 16^0))
其中0003F778
是2s补码整数数据。