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

Math 如何将无符号数字从有符号转换为无符号(二进制和十六进制)?,math,assembly,binary,hex,Math,Assembly,Binary,Hex,所以我正试图从兰德尔·海德的书《汇编语言的艺术》中学习汇编语言,我已经完成了第一章的学习,现在我正在做练习。 我有一个问题:如何转换二进制值(正数或负数) 是的,我知道如何用二进制表示从0到15的数字,10是f,等等。。。 我遇到的问题如下..我得到了这个数字:1001 1001,我必须将它转换成相反的值。到目前为止,我使用了这两个值的补码,得到了这个: 1001 1001 ----->shifting bits -----> 0110 0110 ad

所以我正试图从兰德尔·海德的书《汇编语言的艺术》中学习汇编语言,我已经完成了第一章的学习,现在我正在做练习。 我有一个问题:如何转换二进制值(正数或负数) 是的,我知道如何用二进制表示从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
在转换数字后,我得到:

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
我做错了什么?

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

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

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

编辑:还有一个选项:


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

你的术语有点不对劲。您希望翻转位(您已经这样做了),而不是“移动”位(这是您稍后将了解的内容)

什么使你认为你做错了什么?一个数字的负数
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,你能看到这将在哪里结束吗


这里要学习的经验是,为了解释一个数字,你需要知道它是否是一个有符号的数字。如果它是一个有符号的数字,并且设置了符号位,那么为了将其转换为人类输出,你应该首先对该数字求反,使其为正,然后输出负号和正号e数字。

是的,但符号位的值(正或负)不是应用于整数吗?我不知道如何“应用”符号位。如果想知道有符号整数的值,可以用简单的方法(考虑符号位的值为-2^(w-1),其中w是字的长度,或者通过反转位,加一,然后用所有正权重计算加权和。但计算机不需要这样做。它们可以在不考虑符号位的情况下对二进制值进行加减,解释权留给程序员(CPU通过设置或清除“负”位、“溢出”位或“进位”位来帮助它。)哦,是的,有符号数的绝对值在这种情况下可以计算为256-n,(n=153)。+1表示二进制加法的非常好的表示形式!