空のプロジェクト。コード:floatにキャストするときに非常に大きな値を生成するarc4random_uniform
int i = 0;
while (i < 8) {
float amount = 100-arc4random_uniform(200);
NSLog(@"amount: %f", amount);
i++;
}
ログイン:
amount: 21.000000
amount: 90.000000
amount: 79.000000
amount: 4294967296.000000
amount: 39.000000
amount: 4294967296.000000
amount: 81.000000
amount: 4294967296.000000
4294967296.000000は100 - ran(200)
(擬似コード)の範囲外で明らかに
私はfloat
としてamount
を宣言し、代わりにint
これを使用しない場合起こらない。
ここでは何が起こっていますか?
arc4randomは符号なし整数を返します。減算を行う前に、(符号付きの)整数またはdoubleにキャストします。 – Rob
@Robありがとう!何かが署名されているかどうかを知るための直感的な方法はありませんか、それとも私はドキュメントをチェックするだけですか?私は正式なコードトレーニングを受けておらず、ソースコードを読んで私が知っていることすべてを学んだだけなので、まだ署名付きと署名なしの違いは分かりません。私はそれが数字の前にある*記号*と関係していると仮定しています(または、「署名されていない」ためにそこに欠けています)。 –
標準の32ビットの 'int'は-2,147,483,648と2,147,483,647の間の値を表すことができますが、' unsigned int 'は0と4,294,967,295の間の値しか表現できません(すなわち、2が32のべき乗から1を引いた値)。したがって、符号なしのint値0から1を引くと、-1を表すことができないので、4,294,967,295にラップします。知っている方法については、左に「クイックヘルプ」パネルを開いたままにすると、メソッドが返すタイプを確認するのがはるかに簡単になります。そして悲しいことですが、それは単に開発者であるあなたの責任で、メソッドの署名が正しいことを確認するだけです。 – Rob