3

为什么 NSUInteger 的值是 2^32 - 1 而不是 2^32?这个事实和需要一个 nan 值之间有关系吗?这太令人困惑了。

4

5 回答 5

8

用手指数到 10。真的 :)

数到 10 的标准方法是1,2,3,..10(计算每个手指的数)。然而,“0指”呢?

通常这可能通过将您的手放在我们背后来表示,但这会向系统添加一条信息:您的手是在前面(存在)还是在后面(丢失)?

在这种情况下,将手放在背后相当于分配nil给一个NSNumber变量。但是,NSUInteger表示一个本机整数类型,它没有这种额外的状态,并且仍然必须编码 0才能有用。

在手指上编码值 0 的关键是简单地计数0,1,2..9。相同数量的手指(或信息位)可用,但现在0可以考虑有用.. 以没有10价值为代价(仍然有 10 根手指,但第 10 根手指仅代表价值9)。这与无符号整数具有最大值2^n-1而不是的原因相同2^n:它允许0以最高效率进行编码。

现在,NaN不是典型的整数值,而是来自浮点编码——想想floator CGFloat。一种这样的常见编码是IEEE 754

在计算中,NaN,代表非数字,是一个数值数据类型值,表示一个未定义或无法表示的值,尤其是在浮点计算中..

于 2012-12-03T20:01:29.397 回答
2

2^32-1 因为从 0 开始计数。如果更容易将其视为 2^32 - 2^0。

于 2012-12-03T19:50:46.447 回答
2

它是 32 位无符号整数变量可以容纳的最大值。加一,它会环绕为零。

原因是最小的无符号数是零,而不是一。想一想:您可以容纳到小数点后四位的最大数字是 9999,而不是 10000。那是 10^4-1。

于 2012-12-03T19:52:40.687 回答
1

您不能将 2^32 存储在 4 个字节中,但如果减去一个,则它适合(结果为 0xffffffff)

于 2012-12-03T19:51:31.940 回答
0

与您汽车中的里程表显示最大值为 999999 英里/公里(假设为 6 位数字)完全相同的原因 - 虽然有 10^6 个可能的值,但它不能显示 10^6 本身,而是从 0 到 10^6-1。

于 2012-12-04T10:15:58.870 回答