1

NSNumber が許可する最大の int は? これらのフォーラムの他の場所で回答を見たことがあるため、ここで深く混乱しているのはなぜですか。

int miles = 35000;
vehicle.mileage = [NSNumber numberWithInt:miles];
NSLog(@"int value = %d", miles);
NSLog(@"mileage = %@", vehicle.mileage);

出力は次のとおりです。

int value = 35000
mileage = -30536

ここでひどい簡単なことを見逃しているに違いありませんが、これが正しく機能しない理由を誰かに説明してもらえますか?

更新: さらに調べたところ、 vehicle.mileage は 35000 に正しく設定されていますが、これを NSLog(@"%@", vehicle.mileage) で表示すると、正しく出力されません。これが機能しなくなったときの「魔法の」値をまだ見つけていません。これは、現時点では最大 30,000 の値で機能するためです。

4

4 に答える 4

3

NSNumber は単なるラッパーであるため、ラップされたプリミティブ型がオーバーフローするとオーバーフローします。
したがって、numberWithIntを使用する場合、許可される最大数は INT_MAX (limits.h で定義) であり、numberWithFloatを使用する場合、許可される最大数は FLOAT_MAX などです。
したがって、この場合、オーバーフローすることはないので、INT_MAX がそれほど低くなるとは思えません。

于 2012-12-12T01:00:11.950 に答える
1

概要

NSNumberはNSValueのサブクラスであり、任意のCスカラー(数値)タイプとして値を提供します。これは、値をsignedまたはunsigned char、short int、int、long int、long long int、float、またはdoubleとして、またはBOOLとして設定およびアクセスするための一連のメソッドを定義します。(numberオブジェクトは、必ずしもそれらが作成されたタイプを保持するわけではないことに注意してください。)また、2つのNSNumberオブジェクトの順序を決定するcompare:メソッドも定義します。

だからNSNumberそれが包むものと同じくらい大きい。予期しない結果については、@sjsからの質問の下にあるコメントを確認できます。

于 2012-12-12T01:25:02.120 に答える
0

+numberWithInt:値をsignedintとして解釈します。マイレージがマイナスになることはないので、[NSNumber numberWithUnsignedInt:]

于 2012-12-12T01:11:15.353 に答える
0

NSNumber整数が持つことができる限界はとして知られていますINT_MAXが、35、000はそれに近いところはありません。問題は、vehicleオブジェクトまたはのmileageプロパティにある必要がありますvehicle。どちらかがnil

したがって、先に進んで、次の条件ステートメントを使用してログに記録します。

if (!vehicle) {
 NSLog(@"Vehicle is nil");
}
else if (!vehicle.mileage) {
 NSLog(@"Vehicle's mileage is nil");
}

結果を教えてください

于 2012-12-12T01:21:01.710 に答える