0

NSUInteger を無効にして double にキャストすると、奇妙な動作が発生します。

NSUInteger test = 10;
NSLog(@"%d", test);
NSLog(@"%f", (double) test);
NSLog(@"%d", -test);
NSLog(@"%f", (double) -test);

出力は次のとおりです。

10
10.000000
-10
4294967286.000000

これが事実である理由はありますか?[NSArray count] から返されるものであるため、NSUInteger を使用しています。代わりに int を問題なく簡単に使用できますが、そうする理由について非常に興味があります。

4

1 に答える 1

4

NSUIntegerは符号なし整数型であるためです。したがって、それが否定されたときです(- testまだ符号なし整数です)。しかし、符号なし整数は負の値を保持できないため、オーバーフローしてモジュロ 2 のCHAR_BIT * sizeof(NSUInteger)累乗でラップします。NSUIntegerお使いのプラットフォームでは 32 ビットの長さなので、-10 mod 4294967296正確に 4294967286 となります。

于 2013-04-20T19:35:13.440 に答える