【问题标题】:Value of NSUInteger and NaN?NSUInteger 和 NaN 的值?
【发布时间】:2012-12-03 19:49:01
【问题描述】:

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

【问题讨论】:

  • 此外,在处理编程时,您的想法会转变为从 0 计数到 n-1(对于 n 个状态)而不是从 1 计数到 n。这通常会对您有所帮助(例如:处理数组、这个问题等......)
  • Nit:没有NaN 整数值。 NSUInteger != NSFloat.
  • 因为也需要零,所以你可以从 1 到 2^32 包括在内。他们选择从 0 到 2^32-1,但可能值的数量是相同的。
  • 史蒂文·弗兰克写了一整本关于计算机如何思考数字的书(包括这个主题),标题为“如何计数”:amzn.com/B005DPIKPE

标签: objective-c cocoa nan foundation nsuinteger


【解决方案1】:

用手指数到 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,代表非数字,是数值数据类型值,表示未定义或无法表示的值,尤其是在浮点计算中 ..

【讨论】:

  • “然而 NSUInteger 只是本机整数类型的包装器对象” - 嗯。没有。这是intlong 的typedef,它不是一个对象。你也不能在不强制转换的情况下将nil 分配给它,因为nil 是一个指针。
  • @H2CO3 是的,我错了 :( 我把它和 NSNumber 混淆了。谢谢你指出来。
  • @pst 在您对问题的评论中。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    它是 32 位无符号整数变量可以容纳的最大值。加一,它会绕到零。

    原因是最小的无符号数是零,而不是一。想一想:您可以容纳到小数点后四位的最大数字是 9999,而不是 10000。那是 10^4-1。

    【讨论】:

    • 更具体地说,如果你在 C 中尝试它,“它将环绕为零”,因为下一个更大的值不适合。在数学上,232 - 1 的下一个较大值是 232。如果你用二进制写出来,它是 1 后跟 32 个零(就像 103,以 10 为底,是 1 后跟三个零或 1000)。 1 后跟 32 个零是 33 位数字,显然不能放入 32 位二进制位(32-)空间。可以拟合的最大值是小一:232 - 1。
    【解决方案4】:

    您不能将 2^32 存储在 4 个字节中,但如果您减去 1 则它适合(结果为 0xffffffff)

    【讨论】:

      【解决方案5】:

      与您汽车中的里程表显示最大值为 999999 英里/公里(假设为 6 位数字)完全相同的原因 - 虽然有 10^6 个可能的值,但它不能显示 10^6 本身,而是从 0 到 10^6 -1.

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-10-18
        • 1970-01-01
        • 1970-01-01
        • 2011-11-29
        • 1970-01-01
        • 2015-10-26
        相关资源
        最近更新 更多