0

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

4

1 回答 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 回答