2011-08-07 9 views

答えて

32

NSIntegerNSUIntegerがちょうどプリミティブ整数型のためのtypedefされています。このよう

#if __LP64__ || NS_BUILD_32_LIKE_64 
    typedef long NSInteger; 
    typedef unsigned long NSUInteger; 
#else 
    typedef int NSInteger; 
    typedef unsigned int NSUInteger; 
#endif 

を、あなたはそれらの間の「変換」する必要はありません。シンプルなキャストで十分です。 Like:

NSInteger myInt = 0; 
NSUInteger unsignedInt = (NSUInteger)myInt; 
+0

グラッツィ、私のために働いた2番目の小さなコード! –

+3

符号なしintをunsigned intにキャストしていない危険ですか?私は、符号ビットが符号なし整数の値として解釈される可能性があるので、破損を引き起こす可能性があることを読んでいますか?あるいは、Cがそれを防ぐためにすべての作業をしていますか? NSObjCRuntimeの –

8

これは、この問題を克服する他のユーザーにとって役立つかもしれないので、キャストの実際の効果を示す小さな表があります。これらの値は、デバッガから直接16進値として取得されました。それに応じて選択してください。 32ビットの場合は、最下位ビットをfffffff、最下位ビットを16ビットにしてください。ffffffffffffまた、-1は常に0xffffffffffffffffです。

NSInteger si = NSIntegerMax; // si NSInteger 0x7fffffffffffffff 
si = -1;      // si NSInteger 0xffffffffffffffff 
si = (NSInteger)-1;    // si NSInteger 0xffffffffffffffff 
si = (NSUInteger)-1;   // si NSInteger 0xffffffffffffffff 
si = NSUIntegerMax;    // si NSInteger 0xffffffffffffffff 
si = (NSInteger)NSIntegerMax; // si NSInteger 0x7fffffffffffffff 
si = (NSUInteger)NSIntegerMax; // si NSInteger 0x7fffffffffffffff 
si = (NSInteger)NSUIntegerMax; // si NSInteger 0xffffffffffffffff 
si = (NSUInteger)NSUIntegerMax; // si NSInteger 0xffffffffffffffff 

NSUInteger ui = NSUIntegerMax; // ui NSUInteger 0xffffffffffffffff 
ui = -1;      // ui NSUInteger 0xffffffffffffffff 
ui = (NSInteger)-1;    // ui NSUInteger 0xffffffffffffffff 
ui = (NSUInteger)-1;   // ui NSUInteger 0xffffffffffffffff 
ui = NSIntegerMax;    // ui NSUInteger 0x7fffffffffffffff 
ui = (NSInteger)NSIntegerMax; // ui NSUInteger 0x7fffffffffffffff 
ui = (NSUInteger)NSIntegerMax; // ui NSUInteger 0x7fffffffffffffff 
ui = (NSInteger)NSUIntegerMax; // ui NSUInteger 0xffffffffffffffff 
ui = (NSUInteger)NSUIntegerMax; // ui NSUInteger 0xffffffffffffffff 
3

あなたのNSIntegerがゼロ以上であることが確実な場合は、単にNSUIntegerとしてそれをキャスト。 NSIntegerが負数を表す場合は、NSUIntegerにキャストしないでください。矛盾が生じる可能性があります。

integer results

if (unsignedInteger == signedInteger) { 
    // is TRUE 
} 
if (signedInteger == 4294967266) { 
    // is FALSE 
} 
if (signedInteger == -30) { 
    // is TRUE 
} 
if (unsignedInteger == 4294967266) { 
    // is TRUE 
} 
if (unsignedInteger == -30) { 
    // is TRUE 
} 
+0

。H 'の#define NSUIntegerMax ULONG_MAX' 'のNSLog(@ "ULONG_MAX:%LU"、ULONG_MAX);' ' ULONG_MAX:4294967295' 4294967295から30 + 1 = 4294967266 +1ための ' NSIntegerのUI = NSIntegerMax; 'UI = -1; ' UI =(NSUInteger)-1; ' –

0

NSInteger signedInteger = -30; 
NSUInteger unsignedInteger = (NSUInteger)signedInteger; 

結果あなたは符号なし整数に整数に変換するために欠けている場合、あなたはどちらかあなたは整数が負になることはありませんことを知っている状況にありますすべての負の値を絶対値(つまり、符号なしの値)に変換したい場合があります。絶対値にこの変換を行うことは簡単である:

NSInteger mySignedInteger = -100; 
NSUInteger myUnsignedInteger = fabs(mySignedInteger); 
fabs()

は、浮動小数点の絶対値を返すC関数です。ここでmyUnsignedIntegerの値は100です。

このような関数の使用例は、負の値を別の形式で表示する場合に表示されます。例えば、負の数を占めるの括弧内に表示されます。技術的な観点から、あなたは、単にNSUInteger-これもキャストが、ときNSIntegerを必要としないにNSIntegerを割り当てることができることを

NSString * numberForDisplay; 
if (mySignedInteger < 0) { 
    numberForDisplay = [NSString stringWithFormat:@"(%lu)", myUnsignedInteger]; 
} else { 
    numberForDisplay = [NSString stringWithFormat:@"%lu", myUnsignedInteger]; 
} 

注意をNSUIntegerは非常に大きな正の数を返しますが、これは明らかに非常に望ましくない副作用です:

NSUInteger myUnsignedInteger = mySignedInteger; 
関連する問題