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