发生这种情况是因为,正如@DrummerB 指出的那样,您的int
变量只有足够的位来存储 to 范围内的整-2,147,483,647
数值2,147,483,647
。这被“重置”或“翻转”回负数的原因与计算机如何存储二进制数据有关。
例如,如果您有一个 8 位整数(也称为 a byte
)可以存储整数值 from 0
to255
如果它是无符号的(意味着它只能存储正值)和-127
to127
如果它是有符号的(意味着它可以存储负数) . 当一个整数达到其最大值时,它在内存中由所有整数表示,正如您在此处看到的无符号值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 位存储空间,导致您只有足够的空间来存储值0
和127
1 位用于签名.
现在我们了解了发生了什么,应该注意的是,在撰写本文时,iOS 是一个 32 位操作系统,虽然它可以处理更大的整数,但您可能不想到处使用它们,因为它没有针对使用这些值进行优化。
如果您只想增加可以存储在此变量中的值的范围,我建议将其更改为unsigned int
,这可以使用NSUInteger
typedef 完成。