我有点困惑,我在网上只能看到一半的答案。据说 UInt16 的取值范围是 0-65335。此外,in16 可以容纳的值的总数是 2^16 (65336),对于 2^32 等也是如此。如果它是有符号的,它仍然是 2^16。最小值和最大值为 32768 - +32767。我猜 32768-1 是因为 0?
问问题
140 次
1 回答
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。
于 2013-06-09T11:12:22.360 回答