二者最负数的补码

  • 本文关键字:补码 binary
  • 更新时间 :
  • 英文 :


如何处理2的补码表示中最大的负数?为了简单起见,我将用1字节表示来描述这个问题。最正数是

01111111

表示十进制127。它的二补很容易计算。把这些位调换一下,我们得到

10000000

然后加上单位

10000001

是十进制的-127。

0具有特殊的行为,因为它是自己的互补,这是众所周知的。然而,当我看到最大的负数也是2本身的补数时,我就遇到了困难。最负的是-128

10000000

补码是

01111111

加上单位就得到

10000000

当然是一个错误的结果。这个号码是从未使用过还是从未打到过?

它被使用了,但在某种意义上它是"最奇怪的数字"。有时选择不使用它,或者保留它来指示错误条件。这些只是有时使用的约定,没有什么本质上阻止最负整数的正常使用。在许多情况下,一个数字不会被否定,然后这个特殊的属性就不会出现。

二补整数的这个奇怪的性质意味着,在某些情况下,通常取绝对值并使用非负数进行计算,而取负绝对值(它减去正输入,而不是负输入)并使用非正数进行计算是有意义的。这很有帮助,因为正常绝对值有一个奇怪的现象,即最大的负整数没有正的对应,但正数没有这种奇怪的现象,所以它们都可以被安全地取为负。这个技巧并不总是适用的。

-128否定自身并不总是错误的事情发生。尽管这个结果看起来不正确,但是(使用加法的标准定义)x + (-x) = 0对于包括-128在内的所有值仍然成立,因此它在代数上是合理的。它还至少在一定程度上与取绝对值相互作用:虽然abs(x)确实可以以这种方式产生负结果(这通常是不希望的),但将结果重新解释为相同大小的无符号数会使结果正确,(unsigned 8 bit)abs(-128) = 128

最负整数在位操作代码中使用频率相对较高。它的算术性质在那里不太重要,使得这个数字"不那么奇怪"。

答案很简单。最左边的位是符号(1表示负,0表示正)。如果我们考虑一个普通的正整数并记住它,那么我们只有7位来存储1:

01111111

等于127,或者(2e7)-1。

考虑到补语的概念,我们有:

10000000

等于-128

为了计算二进制系统中正数的可能性数,我们确实有下一个公式:

(2 e (n - 1)) 1

对于否定,我们有:

2 e (n - 1)

这两个公式都是根据两个选项的统计概率得出的:1和0,以及所使用的比特的大小。

另一种观点认为,在正的情况下,我们要考虑从0(0)开始的所有时间,同时从-1开始的所有时间,而不是从0开始的时间。

最新更新