查询二进制数

时间:2010-10-11 19:05:19

标签: assembly binary numbers

我正在读一本关于汇编语言的书。我在那本书中看到了这些句子。

Consider the value “-64”. The eight bit two’s complement value for this number is
0C0h. The 16-bit equivalent of this number is 0FFC0h.

我无法理解这两句话。任何人都可以告诉我-64的8位2的补码是0c0h吗?那么16位的等价值是0ffc0h吗?请尽可能告诉我计算结果。提前谢谢。

5 个答案:

答案 0 :(得分:2)

CPU中的整数使用固定数量的二进制数字表示。例如,使用8位以二进制表示的64是01000000

通常,负数以二进制补码表示。要获得二进制数的二进制补码,首先要计算正数的一个补码(这意味着,翻转所有位),然后加一个。

例如,要计算-64的二进制补码,请以二进制64开头:

01000000 then flip all the bits to get one's complement
10111111 then add one, ignoring the final carry (i.e. overflow)
11000000

11000000以十六进制为C0

可以使用16位执行相同的过程:

00000000 01000000 (64)
11111111 10111111 (one's complement of 64)
11111111 11000000 (one's complement of 64 plus one)
十六进制中的

11111111 11000000FFC0

两个补码用于负数的原因是因为它消除了特殊情况。正数和正数可以正常加在一起,得到正确的答案。例如,8位二进制补码中的-1为11111111。正确地添加一个会返回零(11111111 + 00000001 = 00000000),因为没有足够的位来保存进位。

答案 1 :(得分:1)

将负数作为两个正数的减法可能会有所帮助,例如“0 - 64”。

零只是8位中的00h

减去1,您将获得FFh

再次减去1,您将获得FEh

继续使用该模式62次,你将会在C0h

再次尝试16位模式,记住从0000h中减去一个是FFFFh

答案 2 :(得分:1)

+64 =%0100_0000
-64 =%1011_1111 + 1 =%1100_0000 = 0xC0
当你取一个8位有符号2的补码数并将它扩展到16位时,你必须对它进行符号扩展(将符号位复制到所有新的HO位)

这使得-64 =%1111_1111_1100_0000 = 0xFFC0

答案 3 :(得分:0)

我将使用下标而不是任何编程语言的语法。首先,正数,

+64 10 = +40 16

负数的二进制补码表示是该数字的按位补码加1.在8位中,

- (40 16 )=〜(40 16 )+ 1 = BF 16 + 1 = C0 16

正如你的书所说的那样。要获得16位表示,请将8位表示的最高位复制到所有较高位(这称为符号扩展):

40 16 = 0040 16
  C0 16 = FFC0 16

您必须从上下文了解符号扩展或零扩展是否合适。没有上下文的C0 16 是不明确的:它可以是-64 10 或+192 10 。如果是后者,它应该零扩展到00C0 16 而不是符号扩展到FFC0 16

答案 4 :(得分:0)

想象一台机器使用无限数量的位来表示整数。假设从最右边的'k'位全为零,其下一位为'1'的数字中减去一个。最右边的'k'零将全部变为1,下一位将变为零。

现在假设对于某些'k',最右边的'k'位是零,下一位是未知的,但已知某处有'1'。在那种情况下,即使不知道高位,人们仍然知道底部的“k”位应该从零变为“1”。

二进制补码算法基于这样一个前提,即从任何东西中减去一个应该将所有尾随零转换为'1',而没有数字为零的特殊情况。如果二进制数字包含无限数量的尾随零,则减去一个应该产生无限数量的'1'。

顺便提一下,请注意几何系列的通用公式在这里工作:sumk = 0..inf是1 /(1-a)。通常与'a'值(如1/2)(例如1 + 1/2 + 1/4 + 1/8等的总和等于2)一起使用,它'适用于'值为2(总计等于-1) )。

当然,计算机无法存储无限数量的'1'。因此,有一种约定,即存储的数字表示中的最高位实际上表示超出所有位的状态。