我的iPhone应用模拟器中有UILabel
。它显示一个硬币计数,我有一个动作,计数增加1亿。我希望这个数字继续上升,但由于某种原因,一旦计数达到20亿,它会增加一个减号并开始倒计时,然后重新计算到20亿并再次退回等等。
我希望能够显示更多的数字,即数万亿等...有谁知道这是怎么回事以及如何修复它所以标签数字将继续上升到我想要的高度
我正在使用Xcode和Interface Builder并在模拟器中运行。我将数字存储在int
变量中,如果重要的话。
答案 0 :(得分:6)
您将硬币计数存储在int
中,这就是问题所在。 4字节int
无法存储高于 2,147,483,647 的数字。如果你加1到2,147,483,647你会得到-2,147,483,648,这是可能的最小int
。
如果你想存储更大的数字,你必须使用long
,它可以存储 - (2 ^ 63)和2 ^ 63-1(或-9,223,372,036,854,775,808到9,223,372,036,854,775,807)之间的数字。
有关其他详细信息,请参阅this。
答案 1 :(得分:2)
这是因为正如@DrummerB指出的那样,您的int
变量只有足够的位来存储-2,147,483,647
到2,147,483,647
范围内的整数值。这种“重置”或“翻身”回到负面的原因与计算机如何存储二进制数据有关。
例如,如果您有一个8位整数(也称为byte
),则可以存储从0
到255
的整数值(如果它是无符号的)(意味着它只能存储正值)和-127
到127
如果它已签名(意味着它可以存储负数)。当一个整数达到其最大值时,它在内存中由所有的整数表示,如您在此处看到的无符号值255
:
255 = 11111111
因此,可以存储在8位int
(byte
)中的最大数量为255
。如果您将1
添加到此值,则最终会翻转所有1
值,使它们为零,因为存储值256
将需要第9位,您将完全丢失第9位并且整数值将显示为“翻转”到最小值。
现在..如上所述,上面添加的结果产生值256
,但我们的整数中只有8位存储空间,因此最高位(第9位)丢失。所以你可以用管道|
标记你的存储区域来描绘它:
only 8 bits of storage total
v
255 = 0|11111111|
+ 1 = 0|00000001|
-------------------
256 = 1|00000000|
^
9th bit is lost
在unsigned int
中,情况也是如此,但第一位用于确定值是否为负,因此您获得了签名但丢失了1位存储空间,导致您只有足够的存储空间值0
至127
和1位用于签名。
现在我们已经了解了正在发生的事情,应该注意的是,在撰写本文时,iOS是一个32位操作系统,而可以处理更大的整数,你可能不会我想在整个地方使用它们,因为它没有经过优化来处理这些值。
如果您只想增加可以存储在此变量中的值范围,我建议您将其更改为unsigned int
,这可以使用NSUInteger
typedef来完成。