2012-12-03 35 views
3

为什么NSUInteger 2^32 - 1的值而不是2^32?这个事实和南方价值的需求之间有什么关系吗?这很混乱。NSUInteger和NaN的价值?

+0

此外,通过编程打交道时,你的思维转移到从0到n-1(n个状态)计算,而不是1到n的思考。这将对你有所帮助(例如:处理数组,这个问题等等) – RonaldBarzell

+3

Nit:没有'NaN'整数值。 NSUInteger!= NSFloat。 – 2012-12-03 19:58:00

+1

因为也是零需要,你可以从1到2^32包括在内。他们选择从0到2^32-1,但可能值的数量是相同的。 –

回答

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典型的整数值,而是来自浮点编码 - 想floatCGFloat。一种这样的共同的编码是IEEE 754

在计算中,NaN时,静置不是一个数字,是表示未定义的或不可表示的值的数字数据类型的值,特别是在浮点计算..

+0

“但NSUInteger只是本地整数类型的包装对象” - euh。不。这是一个int型或long型的typedef,它不是一个对象。因为'nil'是一个指针,所以你不能指定'nil'。 – 2012-12-03 20:41:13

+0

@ H2CO3是的,我错了:(我把它和NSNumber混淆了,谢谢你指出来 – 2012-12-03 20:44:14

+0

不客气:) – 2012-12-03 20:46:16

2

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

1

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

2

这是一个32位无符号整型变量可以容纳最大价值。添加一个,它会绕到零。

其原因是,最小的无符号数为零,没有之一。想一想:你可以放进小数点后四位的最大数字是9999,而不是10000,那是10^4-1。

+0

更具体地说,“它将绕回零“如果你在C中尝试它,因为下一个更大的值不适合。在数学上,2 ** 32 - 1的下一个较大值是2 ** 32。如果你用二进制编写,那么它是1,然后是32个零(就像10 ** 3,在基数10中,是1后面跟着三个零 - 或1000)。 1后跟32个零是33个数字,显然不适合32位二进制数字(32 *位*)空间。可以容纳的最大值是少一个:2 ** 32 - 1. –

0

完全一样的原因,在您的汽车的里程表显示最大的999999英里/公里(假设6位数字) - 同时有10^6个可能的值不能显示10^6本身,而是从0到10的6次方-1。