【问题标题】:Two's complement; 0FFFh positive, 0FFFFh negative?二进制补码; 0FFFh 正,0FFFFh 负?
【发布时间】:2013-03-26 17:13:08
【问题描述】:

Art of Assembly一书中,我复制了这句话:

在二进制补码系统中,H.O.数字的位是符号位。如果 H.O.位为零,数为正;如果 H.O.位为一,数为负数。例子:

对于 16 位数字:

8000h 是否定的,因为 H.O.位是一。

100h 是肯定的,因为 H.O.位为零。

7FFFh 是肯定的。

0FFFFh 是否定的。

0FFFh 是肯定的。

我不明白最后两个例子。如果将这两个示例转换为二进制,则第一个得到0000 1111 1111 1111 1111,第二个得到0000 1111 1111 1111。为什么前者为负,后者为正?在我看来,两者的最高位都是 0,因此两者都应该是正数。

【问题讨论】:

  • 在 16 位中,转换为 1111 1111 1111 1111 和 0000 1111 1111 1111。您的插图显示 0xffff 为 20 位。
  • 啊。你能解释一下为什么 0FFFF 有 5 位数字吗?和FFFF一样吗,如果是,写成0FFFF有什么原因吗?
  • 仔细检查来源。它可能会说 0xffff,而不是 0ffff。 0x 表示后面的数字是十六进制的。
  • 我是直接复制粘贴的,本文中h用来表示十六进制。无论如何,我想这只是我拥有的 pdf 而不是约定?
  • nvmd,anakata 回答了它:)

标签: binary x86 twos-complement


【解决方案1】:

0FFFFH 前导 0 的原因是为了给 汇编/编译器提示 F 是数字的一部分。不是全部 汇编程序需要这个。

所以负数实际上是FFFFh,所以1111 1111 1111 1111,则为负数。

computer-programming-forum.com/46-asm/1b99282efbac3bcf.htm

【讨论】:

    【解决方案2】:

    文字说:16 位 数字。因此,您需要查看右侧的第 16 位。在 0FFFF 中,这将是 1。至于前导零,表示该值是一个数字,而不是一个单词(即不是一个变量)。

    如果您建立一个有效数字只能以数字开头的约定,解析器(包括汇编器)可以更轻松地解析数字文字。一些人类也是如此。你知道,DEADBEEF 是一个有效的十六进制数字。

    【讨论】:

      【解决方案3】:

      你能解释一下为什么 0FFFF 有 5 位数字吗?和FFFF一样吗

      不一样。简单的 FFFFh 将被汇编器解释为 符号。你会得到一个编译错误,因为它找不到任何名为“FFFFh”的符号。在它前面加上一个 0 可以确保汇编器将它解释为一个数字。

      【讨论】:

        【解决方案4】:

        如果数字应该是 16 位,则第 16 位作为符号位。首先,

        0FFFFh

        第 16 位是 1

        0000 1111 1111 1111 1111

        在第二个例子中,

        0FFFh

        第16位是0

        0000 1111 1111 1111

        第 16 位为 0,虽然多于 16 位,但二进制只考虑前 16 位。所以,第一个是负数,第二个是正数

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2017-02-13
          • 2019-02-20
          • 2023-03-25
          • 2017-03-16
          • 2012-11-23
          • 1970-01-01
          • 2021-05-16
          • 2015-04-12
          相关资源
          最近更新 更多