【问题标题】: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 11000000FFC0

    二进制补码用于负数的原因是因为它消除了特殊情况。一个负数和一个正数可以正常相加,就会得到正确的答案。例如,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”。因此,有一个约定,表示数字的存储表示中的最高位实际上代表了所有位的状态。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2019-12-17
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2018-12-26
              相关资源
              最近更新 更多