3
float test=-1;

floatwith valueを生成します-1。でも、

float test=arc4random()%500-500;

明らかにバッファオーバーフローの結果である巨大な値を生成します-数値がラップアラウンドします。floatこれは;では発生しないはずです。念のため、Xcode で「署名付きフロート」を作成できるかどうかを確認しようとしましたが、「フロートは署名付きまたは署名なしにすることはできません」と表示されました。

intsigned を作成してから にキャストする回避策を作成しましたfloatが、これがどのように/なぜ起こったのかを知っていただければ幸いです。

4

2 に答える 2

10

arc4random()u_int32_tman ページによるとa が返さarc4random()%500-500れるため、符号なし整数になり、500 を引くと非常に大きな正の値が得られます。代わりにこれを試してください:

float test = ((float)(arc4random() % 500))-500;

signed int を作成し、それを float にキャストするという回避策を作成しましたが、これがどのように/なぜ起こったのかを知っていただければ幸いです。

ライン全体を 1 つずつ見てください。まず、次のものがあります。

arc4random()

上で述べたように、これは unsigned int を返します。value を返すとしましょう12345。次に、モジュラス演算子があるので、式は次のようになります。

12345 % 500

つまり345。次に、500 を引きます。

345 - 500

あなたはそれがあなたに-155を与えると思うでしょうが、そうではありません-私たちはまだここで符号なし整数の領域で作業しているので、あなたは本当に得ます4294967141(またはそのようなもの-私の数学は間違っているかもしれません)。最後に、それをフロートに割り当てます。

float test = 4294967141;

float の仮数部は 23 ビットしかないため、格納される値testは一般的に 4294967141 付近になりますが、4294970000 のように精度は低くなります。

于 2012-07-09T19:11:27.457 に答える
0

Objective-C の浮動小数点数は、C の浮動小数点数とまったく同じです。つまり、IEEE-754 で定義されているように本質的に署名されています。http://en.wikipedia.org/wiki/Single_precision_floating-point_format

于 2012-07-09T19:13:40.840 に答える