两个补码; 0FFFh为正,0FFFFh为负?

时间:2013-03-26 17:13:08

标签: binary x86 twos-complement

从书中装配艺术,我复制了这句话:

  

在二人补语系统中,H.O。一个数字位是一个符号位。如果H.O.位为零,数字为正;如果H.O.位是1,数字是负数。例子:

     

对于16位数字:

     

8000h是否定的,因为H.O.比特就是一个。

     

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

     

7FFFh是积极的。

     

0FFFFh是否定的。

     

0FFFh是积极的。

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

4 个答案:

答案 0 :(得分:2)

  

0FFFFH上前导0的原因是给出   assember / compiler提示F是数字的一部分。不是全部   装配商需要这个。

所以负数实际上是FFFFh,所以1111 1111 1111 1111,那么就是负数。

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

答案 1 :(得分:1)

文字说明: 16位数字。所以你需要从右边看第16位。在0FFFF中,这将是1.对于前导零,它的符号提示该值是数字,而不是单词(即不是变量)。

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

答案 2 :(得分:1)

  

你能解释为什么0FFFF有5位数吗?它与FFFF相同

不一样。简单的FFFFh将被汇编程序解释为符号。而且你会得到一个编译错误,因为它找不到任何名为“FFFFh”的符号。在它前面放置一个0可确保汇编程序将其解释为数字。

答案 3 :(得分:0)

如果数字应为16位,则将第16位作为符号位。在第一个,

  

地址0FFFFh

第16位是1,因为它是

  

0000 1111 1111 1111 1111

在第二个例子中,

  

0FFFH

第16位为0,因为它是

  

0000 1111 1111 1111

第16位为0,虽然有16位以上,但二进制只考虑前16位。所以,第一个是负面的,第二个是正面的