为什么NSUInteger的值为2 ^ 32 - 1而不是2 ^ 32?这个事实与纳米值的需要之间是否存在关系?这太令人困惑了。
答案 0 :(得分:8)
用手指数到10。真的:)
计算到10的标准方法是1,2,3,..10
(计算每个手指的ordinality)。然而,“0指”呢?
通常情况下,这可能表示将手放在背后,但是会将另一条信息添加到系统中:您的手在前面(现在)还是在后面(丢失)?
在这种情况下,将双手放在背后相当于将nil
分配给NSNumber
变量。但是,NSUInteger
表示本机整数类型,不具有此额外状态,而仍必须编码0 才有用。
对手指值0进行编码的关键是简单地计算0,1,2..9
。可以使用相同数量的手指(或信息位),但现在可以考虑有用的0
,但代价是没有10
值(仍然有10个手指,但是第10个手指仅代表值9
)。这与无符号整数的最大值2^n-1
而不是2^n
的原因相同:它允许0
以最高效率进行编码。
现在, NaN
不是典型的整数值,而是来自浮点编码 - 想到float
或{{1 }}。一个这样的常见编码是IEEE 754:
在计算中,NaN(不是数字)是表示未定义或不可表示的值的数值数据类型值,尤其是浮点计算中的 ..
答案 1 :(得分:2)
2 ^ 32-1因为计数从0开始计数。如果它更容易被认为是2 ^ 32 - 2 ^ 0。
答案 2 :(得分:2)
这是32位无符号整数变量可以容纳的最大值。添加一个,它将回绕到零。
原因是最小的无符号数是零,而不是一。想一想:你可以容纳四位小数的最大数字是9999,而不是10000.那是10 ^ 4-1。
答案 3 :(得分:1)
你不能以4个字节存储2 ^ 32,但是如果你减去一个那么它就适合(结果是0xffffffff)
答案 4 :(得分:0)
为什么你车中的里程表显示最大值为999999英里/公里(假设为6位数)的原因完全相同 - 虽然有10 ^ 6个可能值但它不能显示10 ^ 6本身但是0到10 ^ 6 -1