【问题标题】:Query regarding binary numbers查询二进制数
【发布时间】:2010-10-12 03:37:11
【问题描述】:
我正在读一本关于汇编语言的书。我在那本书里看到了这些句子。
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的八位2的补码是0c0h吗? 16位等价物是0ffc0h?如果可能的话,请告诉我计算。提前致谢。
【问题讨论】:
标签:
assembly
binary
numbers
【解决方案1】:
CPU 中的整数使用固定数量的二进制数字表示。例如,用八位二进制表示的 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 11000000 是FFC0。
二进制补码用于负数的原因是因为它消除了特殊情况。一个负数和一个正数可以正常相加,就会得到正确的答案。例如,8 位二进制补码中的 -1 是 11111111。正确添加 1 会返回 0 (11111111 + 00000001 = 00000000),因为没有足够的位来保存进位。
【解决方案2】:
+64 = %0100_0000
-64 = %1011_1111 + 1 = %1100_0000 = 0xC0
当您取一个 8 位有符号 2 的补码并将其扩展为 16 位时,您必须对其进行符号扩展(将符号位复制到所有新的 HO 位中)
这使得 -64 = %1111_1111_1100_0000 = 0xFFC0
【解决方案3】:
将一个负数描述为两个正数相减可能会有所帮助,例如“0 - 64”。
零只是 8 位中的 00h。
减去1,你会得到FFh。
再次减去1,您将得到FEh。
继续该模式 62 次,您将在 C0h。
再次尝试 16 位模式,记住从 0000h 减去一个是 FFFFh。
【解决方案4】:
我将使用下标作为基数,而不是任何编程语言的语法。首先,正数,
+6410 = +4016
负数的二进制补码表示是该数的按位补码加 1。在 8 位中,
-(4016) = ~(4016) + 1 = BF16 + 1 = C016子>
正如你的书所说。要获得 16 位表示,请将 8 位表示的最高位复制到所有高位(这称为 符号扩展):
4016 = 004016
C016 = FFC016
您必须从上下文中知道符号扩展或零扩展是否合适。没有上下文的 C016 是模棱两可的:它可以是 -6410 或 +19210。如果是后者,则应将其零扩展为 00C016 而不是符号扩展为 FFC016。
【解决方案5】:
想象一台机器使用无限位数的整数。假设从最右边的“k”位全为零且下一位为“1”的数字中减去一个。最右边的“k”个零都将变为 1,下一位将变为 0。
现在假设对于某些“k”,最右边的“k”位是零,下一位是未知的,但已知某处是“1”。在那种情况下,即使不知道高位,人们仍然知道底部的“k”位应该从零变为“1”。
Two 的补码算法基于这样一个前提,即从任何事物中减去 1 应将所有尾随零转换为 '1',而数字为零的特殊情况除外。如果二进制中的数字包含无限数量的尾随零,则减一应产生无限数量的“1”。
顺便提一下,几何级数的常用公式在这里有效:sumk=0..inf 是 1/(1-a)。通常与 1/2 之类的“a”值一起使用(例如,1 + 1/2 + 1/4 + 1/8 等的总和等于 2)它“工作”的值为 2(总等于 -1 )。
当然,计算机不可能存储无限个“1”。因此,有一个约定,表示数字的存储表示中的最高位实际上代表了所有位的状态。