0

我的 iPhone 应用模拟器中有一个UILabel。它显示硬币计数,我有一个动作可以增加 1 亿的计数。我希望这个数字继续上升,但由于某种原因,一旦计数达到 20 亿,它就会添加一个减号并开始倒计时,然后重新计数到 20 亿,然后再次倒计时,依此类推。

我希望能够显示更多的数字,例如数万亿等等......有谁知道这是怎么回事以及如何解决它,以便标签数字将继续上升到我想要的高度。

我正在使用 Xcode 和 Interface Builder 并通过模拟器运行。如果这很重要,我会将数字存储在int变量中。

4

2 回答 2

6

您将硬币数量存储在 中int,这就是问题所在。4 字节int不能存储高于2,147,483,647的数字。如果将 1 与 2,147,483,647 相加,您将得到 -2,147,483,648,这是可能的最小值int

如果要存储更大的数字,则必须使用 along可以存储介于 -(2^63) 和 2^63−1(或 -9,223,372,036,854,775,808 到 9,223,372,036,854,775,807)之间的数字。

有关其他详细信息,请参阅内容。

于 2012-10-17T22:15:32.290 回答
2

发生这种情况是因为,正如@DrummerB 指出的那样,您的int变量只有足够的位来存储 to 范围内的整-2,147,483,647数值2,147,483,647。这被“重置”或“翻转”回负数的原因与计算机如何存储二进制数据有关。

例如,如果您有一个 8 位整数(也称为 a byte)可以存储整数值 from 0to255如果它是无符号的(意味着它只能存储正值)和-127to127如果它是有符号的(意味着它可以存储负数) . 当一个整数达到其最大值时,它在内存中由所有整数表示,正如您在此处看到的无符号值255

255 = 11111111

int所以 8 位( byte) 中可以存储的最大数是255。如果添加1到该值,您最终会翻转所有1值以使它们为零,并且由于存储该值256将需要第 9 位,您会完全丢失第 9 位,并且整数值将出现“翻转”到最小值.

现在.. 正如我上面所说的,上面加法的结果产生了 value 256,但是我们的整数中只有 8 位存储空间,所以最高有效位(第 9 位)丢失了。|所以你可以用管道标记你的存储区域来描绘它:

            only 8 bits of storage total
            v
 255 = 0|11111111|
+  1 = 0|00000001|
-------------------
 256 = 1|00000000|
       ^
       9th bit is lost

在 anunsigned int中也是如此,但是第一位用于确定该值是否为负,因此您获得签名但您丢失 1 位存储空间,导致您只有足够的空间来存储值01271 位用于签名.

现在我们了解了发生了什么,应该注意的是,在撰写本文时,iOS 是一个 32 位操作系统,虽然它可以处理更大的整数,但您可能不想到处使用它们,因为它没有针对使用这些值进行优化。

如果您只想增加可以存储在此变量中的值的范围,我建议将其更改为unsigned int,这可以使用NSUIntegertypedef 完成。

于 2012-10-17T23:09:14.213 回答