正确的转换应该是:
Decimal = Binary 2's complement
-100 = 1001 1100
-100 >> 1 = 1100 1110 = -50
-100 >> 2 = 1110 0111 = -25
-100 >> 3 = 1111 0011 = -13
逐一评论您的步骤:
- 将
-100 转换为二进制01100100
您没有转换-100。您正在将 100 转换为二进制。小修正,但非常重要。
- 二进制补码
10011100
这是正确的,因为我们通过反转一个数字并添加1 来取一个数字的补码。
inv(01100100) = 1001 1011
add one = 1001 1100
- 算术右移
11110011
为了 100% 准确,我会说 right arithmetic shift three times
- 再次补码
00001101
这就是我认为您的问题所在......
所以结果是11110011 我们都同意这一点。这里的问题是十进制的11110011 是什么?我知道进行转换的两种方法。我会在这里尝试总结一下。
方法一:补码
我们知道11110011 是一个负数,因为它的MSB 是1。为了找出值是什么,我们取 2 的补码。所以我们反转值并添加1。
inv(11110011) = 0000 1100
add 1 = 0000 1101
---------
convert to decimal 13
所以,我们知道它是负数,现在我们知道值了。所以-13 就是答案。
方法二:使用权重
我们为每个位赋予一个权重,并将它们加在一起。所有位都具有正权重,除了 MSB 具有负权重。
Bit index 7 6 5 4 3 2 1 0
Weight -128 64 32 16 8 4 2 1
所以对于我们的结果,我们有:
Bit index 7 6 5 4 3 2 1 0
Weight -128 +64 +32 +16 +8 +4 +2 +1
-------------------------------------------
-13 1 1 1 1 0 0 1 1
-128 +64 +32 +16 +0 +0 +2 +1
-128
+ 64
+ 32
+ 16
+ 2
+ 1
----
-13
这两种方法都是有效的,并且最终会为您提供正确的转换,这取决于您喜欢哪种转换方法。
如果您有任何疑问,请阅读this。