如何将无符号数字从有符号转换为无符号(二进制和十六进制)?

时间:2012-11-05 15:02:00

标签: math assembly binary hex

所以我正在努力学习兰德尔海德的书中的汇编语言:汇编语言的艺术,我已经完成了第一章的学习,现在我正在尝试练习。 我有以下问题:我如何转换二进制值(正面或负面) 转换为相反符号的十六进制值。是的,我知道如何用二进制表示从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

我做错了什么?

2 个答案:

答案 0 :(得分: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?

,你能看到这会结束吗?

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

答案 1 :(得分: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