为什么 NSUInteger 的值是 2^32 - 1 而不是 2^32?这个事实和需要一个 nan 值之间有关系吗?这太令人困惑了。
5 回答
用手指数到 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
不是典型的整数值,而是来自浮点编码——想想float
or CGFloat
。一种这样的常见编码是IEEE 754:
在计算中,NaN,代表非数字,是一个数值数据类型值,表示一个未定义或无法表示的值,尤其是在浮点计算中..
2^32-1 因为从 0 开始计数。如果更容易将其视为 2^32 - 2^0。
它是 32 位无符号整数变量可以容纳的最大值。加一,它会环绕为零。
原因是最小的无符号数是零,而不是一。想一想:您可以容纳到小数点后四位的最大数字是 9999,而不是 10000。那是 10^4-1。
您不能将 2^32 存储在 4 个字节中,但如果减去一个,则它适合(结果为 0xffffffff)
与您汽车中的里程表显示最大值为 999999 英里/公里(假设为 6 位数字)完全相同的原因 - 虽然有 10^6 个可能的值,但它不能显示 10^6 本身,而是从 0 到 10^6-1。