我很担心我不理解这项任务中的问题,我希望有人可以提供一些指导。
“找到对应于以下双字2的补码十六进制表示的十进制整数: 34 D7 CF 5B“
我希望可以安全地假设的一些事情是:
我有两种方法,有两种不同的答案(两者都可能是错误的)
方法1: 假设它是正面的并且直接从十六进制转换为十进制
3*16^7 + 4*16^6 + ... + B*16^0
产生886558555
方法2:
Convert it to binary
Flip the values (0 to 1 and 1 to 0)
Add 1
Yielding, in binary 1100 1101 0010 1000 0011 0000 1010 0101
or in dec: -853004123
答案 0 :(得分:0)
2补码是一种编码负数的特定方法
为了使正数为负数或反之亦然,您将所有位反转并添加1.
添加有两种方式,所以你永远不会减去。
在2的补码表示法中,最高有效位(MSB)会告诉您数字是否为负数。
假设34 D7 CF 5B
是一个常见的32位数字(而不是30位不常见的数字),则MSB为零,因此该数字为正。
因为数字为正,所以不需要转换,我们可以从十六进制计算十进制表示:
34 D7 CF 5B
|| || || |+-> 11 * 16^0 = 11
|| || || +--> 05 * 16^1 = 80
|| || |+----> 15 * 16^2 = 3840
etc.
结果是:886558555,因为您已经计算过了。
反转会强制MSB设置为负数 当从0减去1以及从任意数字中加减时,2的补码是正确的。它只会在溢出的情况下发生故障。
为了检测到这一点,许多CPU都有一个o V
erflow标志,该标志是在操作数的MSB发生变化时设置的。
2补体中阳性的数字在其他符号中也是正数。它只是在不同系统中编码不同的负数。
请注意,您的方法2描述了如何翻转2的补码中的符号,但因为该数字已经是正数,所以它不适用且不应该使用。