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