最大int和范围值混淆

时间:2013-06-09 10:51:27

标签: types programming-languages

我有点困惑,我在网上只能看到答案的一半。 据说UInt16的值范围为0-65335。 16中的值可以保持为2 ^ 16(65336),对于2 ^ 32等也是如此。 如果签名,它仍然是2 ^ 16。最小值和最大值为32768 - +32767。我猜32768-1是因为0?

1 个答案:

答案 0 :(得分:1)

这是因为两个补码符号,它通常用于编码负数。我们以8位整数为例来节省一些打字。

无符号数的编码如下:

   0  00000000
   1  00000001
   2  00000010
 ...  ........
 254  11111110
 255  11111111

对于有符号整数,零和正值具有与无符号情况相同的符号:

   0  00000000
   1  00000001
   2  00000010
 ...  ........
 126  01111110
 127  01111111

但现在发生了一些有趣的事情。对于下一个更大的值11111111,我们将其换向负值,并继续向上计数:

-128 10000000 -127 10000001 -126 10000010 .... ........   -2 11111110   -1 11111111

如您所见,有128个可能的负数,128个可能的正/零数。因为正数中包含零,所以只有127个时隙保留为严格正整数。

您可能想知道为什么我们不将10000000视为128,并将下一个值换行,将10000001视为-127。我认为这是因为它打破了漂亮的模式:负数从最高位开始为1,非负数从0开始。对于无符号数的对称性也更好,其中最大正值也是2 n - 1,而不是2 n