NSUInteger的值和NaN的含义是什么?

3

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


此外,在处理编程时,将思维转换为从0到n-1(对于n个状态)进行计数,而不是从1到n。这将有助于您在一般情况下的处理(例如:处理数组,这个问题等)。 - RonaldBarzell
3
注意:不存在NaN整数值。NSUInteger不等同于NSFloat - user166390
1
因为零也是必需的,所以您可以从1到2^32(含)。他们选择了从0到2^32-1,但可能值的数量是相同的。 - Ramy Al Zuhouri
1
Steven Frank写了一本关于计算机如何思考数字的完整书籍(包括这个主题),书名为“How to Count”:http://amzn.com/B005DPIKPE - Peter Hosey
5个回答

8

用手指数到10。真的 :)

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

通常情况下,这可能表示将手放在背后,但这会为系统添加另一个信息:你的手是在前面(存在)还是在后面(缺失)?

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

将值为0编码在手指上的关键是简单地数数0,1,2..9。同样数量的手指(或信息位)可用,但现在有用的0可以被计算...代价是没有一个10值(仍然有10个手指,但第十个手指只代表值9)。这也是无符号整数具有最大值2^n-1而不是2^n的原因:它允许以最大效率编码0
现在,NaN不是典型的整数值,而是来自浮点编码 - 想想floatCGFloat。其中一种常见的编码是IEEE 754
在计算机中,NaN代表不是数字(not a number),它是一种数值数据类型,代表着未定义或无法表示的值,特别是在浮点运算中。

然而,NSUInteger只是本机整数类型的包装对象。哦不。它是intlong的typedef,它不是一个对象。此外,您不能将nil分配给它而不进行转换,因为nil是一个指针。 - user529758
@H2CO3 是的,我非常错了 :( 我把它和NSNumber混淆了。谢谢你指出来。 - user166390
@pst 在你对这个问题的评论中。 - Peter Hosey

2

2^32-1是因为在比特位计数时从0开始。如果更容易理解,可以将其视为2^32 - 2^0。


2

这是一个32位无符号整数变量可以表示的最大值。如果加1,它将会回到0。

原因在于最小的无符号数字是0,而不是1。想一想:你能够放入四个十进制位中的最大数字是9999,而不是10000。也就是10的4次方减1。


更具体地说,如果您在C中尝试,它将“绕回到零”,因为下一个较大的值无法适应。从数学上讲,从2 ** 32-1开始的下一个较大的值是2 ** 32。如果您以二进制形式写出来,它就是1后面跟着32个零(就像10 ** 3在十进制中是1后面跟着三个零或1000一样)。1后面跟着32个零是33位数字,显然无法适应32位二进制数字(32位比特)空间。可以适合的最大值是减去1的2 ** 32-1。 - Peter Hosey

1

你不能在4个字节中存储2^32,但如果你减去1,它就可以适应(结果是0xffffffff)


0

这就是为什么你车上的里程表最多只能显示999999英里/千米(假设有6位数字)的原因 - 尽管它有10^6个可能的值,但它不能显示10^6本身,而只能显示0到10^6-1。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接