3

所以我正在尝试从 Randall Hyde 的书中学习汇编语言:汇编语言的艺术,我已经完成了第一章的学习,现在我正在尝试做练习。我有以下问题:如何将二进制值(正或负)转换为相反符号的十六进制值。是的,我知道如何用二进制表示从 0 到 15 的数字,而且 10 是 f 等等关于......我遇到的问题如下......我得到了这个数字:1001 1001,我必须将其转换为相反的值。到目前为止,我已经使用了二进制补码并获得了这个:

1001 1001 ----->shifting bits -----> 0110 0110
                add 1         -----> 0110 0111

我应该得到与第一个数字相反的结果。相反,当我计算结果的值时,我得到了这个:

1001 1001 = 2^0+2^3+2^4+2^7 = 1+8+16+128 = 153 (which in my opinion is fine...)

转换数字后,我得到了这个:

0110 0111= 2^0+2^1+2^2+2^5+2^6 = 1+2+4+32+64 = -103

我究竟做错了什么 ?

4

2 回答 2

2

你的术语有点不对劲。你想翻转位(你做了),而不是“移动”它们(这是你稍后会学到的东西。

是什么让你觉得你做错了什么?一个数的负数x是另一个数y,如x + y = 0。让我们看看你的两个数字并将它们相加:

  1001 1001
+ 0110 0111
-----------
  1111 1112
          ^ oops, 2 should be 10, so record 0 and carry the 1

  1111 1110
+        10 
-----------
  1111 1120
         ^ oops, 2 should be 10, so record 0 and carry the 1

一旦你继续携带 1,你能看到这将在哪里结束吗?

这里要学习的教训是,为了解释一个数字,您需要知道它是否打算成为一个有符号的数字。如果它打算是一个有符号数并且设置了符号位,那么为了将其转换为人类输出,您应该首先否定该数字,使其为正数,然后输出一个负号和正数。

于 2012-11-05T15:28:39.453 回答
0

符号位的“值”是-128。这就是诀窍。
(对于无符号值,MSB的值自然是+128)

1001 1001 = -128 + 16+8+1 = -103 --> 通过反转位 0110 0110 = 64+32 + 4+2 = 102 转换为绝对值
(加 1 时,0110 0111 == 103)

1001 1001 = 128 + 16 + 8 + 1 = 153 无符号。

编辑:另一种选择:

|1001 1001| = 256 - (128+16+8+1) = 256-153 = 103

于 2012-11-05T15:28:02.043 回答