Types 最大整数和范围值混淆

Types 最大整数和范围值混淆,types,programming-languages,Types,Programming Languages,我有点困惑,我在网上只能看到一半的答案。 据说UInt16的值范围为0-65335。此外,16中可容纳的值的总数为2^16(65336),与2^32等相同。 如果已签名,则仍为2^16。最小值和最大值分别为32768-+32767。我猜32768-1是因为0?这是因为2的补码符号,它通常用于编码负数。让我们以8位整数为例来节省一些输入 无符号数字的编码如下: 0 00000000 1 00000001 2 00000010 ... ........ 254 111

我有点困惑,我在网上只能看到一半的答案。 据说UInt16的值范围为0-65335。此外,16中可容纳的值的总数为2^16(65336),与2^32等相同。 如果已签名,则仍为2^16。最小值和最大值分别为32768-+32767。我猜32768-1是因为0?

这是因为2的补码符号,它通常用于编码负数。让我们以8位整数为例来节省一些输入

无符号数字的编码如下:

   0  00000000
   1  00000001
   2  00000010
 ...  ........
 254  11111110
 255  11111111
对于有符号整数,零和正值与无符号情况下的符号相同:

   0  00000000
   1  00000001
   2  00000010
 ...  ........
 126  01111110
 127  01111111
但现在发生了一些有趣的事情。对于下一个较大的值11111111,我们将其换成负值,然后继续向上计数:

-12810000000 -127 10000001 -126 10000010 .... ........ -2 11111110 -11111111

如您所见,有128个可能的负数和128个可能的正数/零数。因为零包含在正数中,所以对于严格正整数,只剩下127个插槽


你可能想知道为什么我们不把10000000看成128,然后把它放在下一个值上,把10000001当作127。我认为这是因为它打破了好的模式:负数的最高有效位以1开头,非负数的最高有效位以0开头。对于无符号数的对称性也更好,其中最大正值也是2n-1,而不是2n。

谢谢,如我所述,int16总共存储2^16个值,对吗?是的,不管有符号还是无符号。有16位,每个位可以有2个值,因此有2^16个值。