0

私は次のコードを持っています:

NSUInteger one = 1;
CGPoint p = CGPointMake(-one, -one);
NSLog(@"%@", NSStringFromCGPoint(p));

その出力:

{4.29497e+09, 4.29497e+09}

一方で:

NSUInteger one = 1;
NSLog(@"%i", -one); // prints -1

おそらく何らかのオーバーフローが発生していることは知っていますが、なぜ2つのケースが異なるのか、そしてなぜそれが私が望むように機能しないのですか?些細な算術を行う場合でも、変数と式の特定の数値タイプを常に思い出す必要がありますか?

PSもちろん、のunsigned int代わりに使用することもできますがNSUInteger、違いはありません。

4

2 に答える 2

1

単項-を符号なしの値に適用すると、符号なしの値は否定されUtype_MAX + 1、その値に繰り返し加算されることによって符号なしの衣服に強制的に戻されます。これをに渡すとCGPointMake()、その(非常に大きい)符号なしの値がに割り当てられCGFloatます。

NSLog()符号付き整数としてログに記録しているため、ステートメントにはこれが表示されません。これを符号付き整数に戻すと、実際に-1になります。使ってみるNSLog("%u", -one)と、すぐに戻ってきます4294967295

unsigned intNSUIntegerDOESは違いを生みます:LP64アーキテクチャ(x86_64、ppc64)の場合、または定義済みでコンパイルする場合unsigned intの半分のサイズです。たまたまポインタサイズです(ただし、ポインタのサイズの整数が本当に必要な場合は使用してください)。LP64モデルを使用しているときではありません。NSUIntegerNS_BUILD_32_LIKE_64NSUIntegeruintptr_tunsigned

于 2010-09-28T06:41:15.760 に答える
0

実際にはわかりませんが、これらすべてのデータ型についてネット上で読んでみると、問題はNUSInteger(int(x32)またはlong(x64)のいずれかに解決される)からCGFloatへの変換にあると思います(これはfloat(x32)またはdouble(x64)のいずれかに解決されます)。

2番目の例では、同じ変換は発生していません。それを影響しているかもしれない他のことは、私の読書から、NSUintegerは負の数を含むように設計されておらず、正の数だけを含むように設計されているということです。ですから、それは物事がうまくいかないところです。

于 2010-09-28T06:34:09.317 に答える