これは、@ DrummerBが指摘したように、変数に〜int
の範囲の整数値を格納するのに十分なビットしかないために発生しています。これがネガティブに「リセット」または「ロールオーバー」される理由は、コンピューターがバイナリーのデータを保存する方法と関係があります。-2,147,483,647
2,147,483,647
たとえば、8ビット整数(別名)がある場合、符号なしの場合(正の値のみを格納できることを意味します)および符号付きの場合(負の数を格納できることを意味します)までのbyte
整数値を格納0
できます。 。整数が最大値に達すると、ここに符号なしの値が表示されているように、メモリ内ですべての整数で表されます。255
-127
127
255
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