查找对应于2的补码十六进制表示的整数

时间:2017-01-21 19:50:23

标签: assembly x86-16

我很担心我不理解这项任务中的问题,我希望有人可以提供一些指导。

“找到对应于以下双字2的补码十六进制表示的十进制整数: 34 D7 CF 5B“

我希望可以安全地假设的一些事情是:

  1. 它将是32位长
  2. 这将是正数,因为领先的权力是3或二进制0011
  3. 我有两种方法,有两种不同的答案(两者都可能是错误的)

    方法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
    

1 个答案:

答案 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的补码中的符号,但因为该数字已经是正数,所以它不适用且不应该使用。

相关问题