为什么NSUInteger的值是2^32 - 1而不是2^32?这个事实与nan值的需要有关吗?这太令人困惑了。
为什么NSUInteger的值是2^32 - 1而不是2^32?这个事实与nan值的需要有关吗?这太令人困惑了。
用手指数到10。真的 :)
数到10的标准方法是1,2,3,..10
(计算每个手指的序号)。但是,如果是“0个手指”呢?
通常情况下,这可能表示将手放在背后,但这会为系统添加另一个信息:你的手是在前面(存在)还是在后面(缺失)?
在这种情况下,将手放在背后相当于向NSNumber
变量分配nil
。但是,NSUInteger
表示一种本地整数类型,它没有此额外状态,并且必须仍然编码为0才能有用。
0,1,2..9
。同样数量的手指(或信息位)可用,但现在有用的0
可以被计算...代价是没有一个10
值(仍然有10个手指,但第十个手指只代表值9
)。这也是无符号整数具有最大值2^n-1
而不是2^n
的原因:它允许以最大效率编码0
。NaN
不是典型的整数值,而是来自浮点编码 - 想想float
或CGFloat
。其中一种常见的编码是IEEE 754:int
或long
的typedef,它不是一个对象。此外,您不能将nil
分配给它而不进行转换,因为nil
是一个指针。 - user5297582^32-1是因为在比特位计数时从0开始。如果更容易理解,可以将其视为2^32 - 2^0。
这是一个32位无符号整数变量可以表示的最大值。如果加1,它将会回到0。
原因在于最小的无符号数字是0,而不是1。想一想:你能够放入四个十进制位中的最大数字是9999,而不是10000。也就是10的4次方减1。
你不能在4个字节中存储2^32,但如果你减去1,它就可以适应(结果是0xffffffff)
这就是为什么你车上的里程表最多只能显示999999英里/千米(假设有6位数字)的原因 - 尽管它有10^6个可能的值,但它不能显示10^6本身,而只能显示0到10^6-1。
NaN
整数值。NSUInteger
不等同于NSFloat
。 - user166390