web-dev-qa-db-ja.com

NSIntegerをNSUIntegerに変換しますか?

NSIntegerをNSUIntegerに変換しようとしていますが、グーグルで検索しましたが、本当の答えは見つかりませんでした。どうすればよいですか?

22
SimplyKiwi

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

そのため、それらの間で「変換」する必要はありません。単純なキャストで十分です。お気に入り:

NSInteger myInt = 0;
NSUInteger unsignedInt = (NSUInteger)myInt;
33
aroth

これは他の人がこの問題に遭遇するのに役立つかもしれないので、ここにキャストの実際の効果を示す小さな表があります。これらの値は、デバッガーから16進値として直接取得されました。キャストが効果を引き起こすことがわかるように、それに応じて選択してください。 32ビットの場合は下からループffffffff、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
8
tgunr

NSIntegerがゼロ以上であることが確実な場合は、単にNSUIntegerとしてキャストします。 NSUIntegerが負の数を表す場合は、不整合につながる可能性があるため、NSIntegerにキャストしないでください。

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

結果は

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
}
3
Brian

整数を符号なし整数に変換したい場合は、整数が決して負にならないことがわかっている状況にあるか、すべての負の値を絶対値(つまり、符号なしの値)に変換したい場合があります。 。この変換を絶対値に行うのは簡単です。

_NSInteger mySignedInteger = -100;
NSUInteger myUnsignedInteger = fabs(mySignedInteger);
_

fabs()は、任意の浮動小数点数の絶対値を返すC関数です。ここで、myUnsignedIntegerの値は100になります。

このような関数の考えられる使用例は、負の値を別の形式で示す表示です。たとえば、会計では、負の数が括弧内に表示されます。

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

技術的な観点からは、NSIntegerをNSUIntegerに割り当てるだけでよいことに注意してください。これにはキャストも必要ありませんが、NSIntegerが負の場合、NSUIntegerは非常に大きな正の数を返します。これは、明らかに非常に望ましくない側面です。効果:

_NSUInteger myUnsignedInteger = mySignedInteger;
_
0
Duncan Babbage