これは、@ DrummerBが指摘したように、変数に〜intの範囲の整数値を格納するのに十分なビットしかないために発生しています。これがネガティブに「リセット」または「ロールオーバー」される理由は、コンピューターがバイナリーのデータを保存する方法と関係があります。-2,147,483,6472,147,483,647
たとえば、8ビット整数(別名)がある場合、符号なしの場合(正の値のみを格納できることを意味します)および符号付きの場合(負の数を格納できることを意味します)までのbyte整数値を格納0できます。 。整数が最大値に達すると、ここに符号なしの値が表示されているように、メモリ内ですべての整数で表されます。255-127127255
255 = 11111111
intしたがって、8ビット(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ビットのストレージが失われるため、値を格納するのに十分なスペースと署名用の1ビットしかありませ0ん127。 。
何が起こっているのかがわかったので、この記事の執筆時点では、iOSは32ビットオペレーティングシステムであり、より大きな整数を処理できますが、あちこちで使用したくない場合があることに注意してください。これらの値で動作するように最適化されていません。
この変数に格納できる値の範囲を増やしたいだけの場合は、 typedefunsigned intを使用して変更できるようにすることをお勧めします。NSUInteger