0

UILabeliPhoneアプリシミュレーターにがあります。コインカウントが表示され、カウントに1億を追加するアクションがあります。数を増やし続けたいのですが、どういうわけか、カウントが20億に達すると、マイナス記号を追加してカウントダウンを開始し、次に20億までカウントバックし、再びカウントダウンします。

はるかに多くの桁数、つまりトリリオンなどを表示できるようにしたい...これで何が起こっているのか、ラベルの桁数が必要なだけ高くなるように修正する方法を知っている人はいますか。

XcodeとInterfaceBuilderを使用していて、シミュレーターを実行しています。intそれが重要な場合は、数値を変数に格納しています。

4

2 に答える 2

6

あなたはあなたのコインカウントをに保存しますint、それが問題です。4バイトは、 2,147,483,647intを超える数値を格納できません。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)までの数値を格納できるaを使用する必要があります。

詳細については、こちらをご覧ください。

于 2012-10-17T22:15:32.290 に答える
2

これは、@ 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ビットしかありませ0127。 。

何が起こっているのかがわかったので、この記事の執筆時点では、iOSは32ビットオペレーティングシステムであり、より大きな整数を処理できますが、あちこちで使用したくない場合があることに注意してください。これらの値で動作するように最適化されていません。

この変数に格納できる値の範囲を増やしたいだけの場合は、 typedefunsigned intを使用して変更できるようにすることをお勧めします。NSUInteger

于 2012-10-17T23:09:14.213 に答える