为什么变量中的负数比正数(签名变量)有更大的限制?

时间:2015-11-15 01:54:51

标签: c++ variables binary range negative-number

如上图所示,所有变量的负极限都比正极限多一个。我是如何添加额外的一个。我知道变量中的第一个数字用于判断它是负数(1)还是不是(0)。我也知道二进制是基于2的幂。我感到困惑的是,当正面本身不能更高而负面只有一位数变化时,如何有一个额外的。例如,short可以达到32,767(01111111 11111111)或16,383 +它下面的二进制数的所有十进制值。负数是一样的,除了开头的一个,对吧?那么负数如何有更大的限制呢?感谢任何回答的人!

enter image description here

3 个答案:

答案 0 :(得分:2)

如果使用二的补码存储整数,那么你会得到一个额外的负值和一个零。如果使用一个补码带符号幅度存储它们,则得到两个零和负值相同的正值。浮点数有自己的存储方案,在IEEE格式下使用有一个明确的符号位。

答案 1 :(得分:1)

原因是一个名为“2的补码”的方案来表示有符号整数。

您知道有符号整数的最高位代表符号。但你不知道的是,它也代表一个值,值。

以4位2的补码有符号整数为例:

1     0    1    0
-2^3  2^2  2^1  2^0

这个4位整数被解释为:

  1 * -2^3  +  0 * 2^2  +  1 * 2^1  +  0 * 2^0
= -8 + 0 + 2 + 0
= -6

采用这种方案,4位2的补码最大值为7。

0     1    1    1
-2^3  2^2  2^1  2^0

分钟是-8。

1     0    0    0
-2^3  2^2  2^1  2^0

此外,0由0000表示,1为0001,-1为1111。比较这三个数字,我们可以观察到的“符号位”为正,而且2的补码方案中没有“负零”。换句话说,范围的一半仅由负数组成,但范围的另一半包括零和正数。

答案 2 :(得分:0)

  

我知道变量中的第一个数字用于判断它是否为负数(1)或者是否为(0)。

第一个二进制数字(或),是的,假设两个补码表示。这基本上回答了你的问题。有32,768个数字< 0(-32,768 .. -1)和32,768个数字> = 0(0 .. +32,767)。

另请注意,在二进制中,总可能的表示(位模式)是偶数。你不能让绝对值的最小值和最大值相等,因为你最终会得到奇数个可能的值(计数0)。因此,您必须浪费或宣布非法至少一位模式。