二进制数的双字长度2的补码表示?

时间:2014-09-09 16:26:17

标签: windows assembly double twos-complement

在Assembler中完成我的第一个作业,这是提出的问题......

1.找到以下每个十进制数的双字长度2的补码表示。 (必须显示获得结果的步骤,否则您将获得零点。)

a -100

b -55555

我有一位非常外国的教授,我完全无法理解,所以我需要一些帮助。所以双字是32位,这将使......

A)0000|0000|0000|0000|0000|0001|0000|00001开头为负{| 1}},1 | 0001为0 | 0000为0 |前导0为填充。

b)1000 | 0000 | 0000 | 0101 | 0101 | 0101 | 0101 | 0101(填充0的负{| 1}}开始为0000 | 5的剩余1

鉴于这种方式是正确的,2的补码将是......

我不知道。我通过实例学习,我的教授没有做任何事。如果有人能为我经历一个,我会非常感激。我知道那里有计算器将小数转换为他们的两个赞美但我想知道怎么做。再次感谢。

2 个答案:

答案 0 :(得分:2)

偏离轨道。记住它们是十进制数字,你不能突然假装它们是十六进制(并使用半字节),而且#34;只需在开头放一个数字"尽可能远离两个人的补充。

因此,让我们从头开始,将100和55555转换为二进制。减去将进入它的两个最高功率,将相应位设置为1.因此对于100:

100 - 64 = 36,  set bit 1000000
 36 - 32 =  4,  set bit  100000
  4 -  4 =  0,  set bit     100
                        ------- +
                        1100100

或十六进制的0x64。 55555更像是一样的。

您可能已经学习(或应该已经学会)身份-x = ~x + 1,使用它可以简单地否定100和55555.取二进制表示,尽可能宽的结果是(32位),所以

0000 0000 0000 0000 0000 0000 0110 0100

反转所有位:

1111 1111 1111 1111 1111 1111 1001 1011

添加1:

1111 1111 1111 1111 1111 1111 1001 1100

或十六进制0xFFFFFF9C

答案 1 :(得分:1)

SO 希望有人在很久以前用简单的语言向我解释过。

"两个人的补充"事情......

第一步:将数字转换为1位和0位的二进制字符串

第二步:翻转所有这些位

第三步:在结果中添加一个

两个快速示例,以8位整数

  Decimal Number: 37

  Make it Hex: 025h

  Make it Binary: 0010 0101

  Flip those bits: 1101 1010

  Add binary one:  0000 0001

  Get this result: 1101 1011

  That is the 8 bit representation of the integer, negative 37 (decimal) 




  Example, the other way

  Decimal Number: -41  (that's negative 41)

  Make it Hex: 0D7h

  Make it Binary: 1101 0111

  Flip those bits: 0010 1000

  Add binary one:  0000 0001

  Get this result: 0010 1001

  That is the 8 bit representation of the integer, 41 decimal (i.e., positive 41) 

顺便说一句,作为一项练习,你可以在整天和两个赞美之间达到相同的价值,只需在负数和正数之间来回翻转。

对于16位,32位和64位数字,只需将其扩展到更高的位。