NSIntegerをNSUIntegerに変換しようとしていますが、グーグルで検索しましたが、本当の答えは見つかりませんでした。どうすればよいですか?
NSInteger
とNSUInteger
は、プリミティブ整数型の単なる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;
これは他の人がこの問題に遭遇するのに役立つかもしれないので、ここにキャストの実際の効果を示す小さな表があります。これらの値は、デバッガーから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
NSInteger
がゼロ以上であることが確実な場合は、単にNSUInteger
としてキャストします。 NSUInteger
が負の数を表す場合は、不整合につながる可能性があるため、NSInteger
にキャストしないでください。
NSInteger signedInteger = -30;
NSUInteger unsignedInteger = (NSUInteger)signedInteger;
結果は
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
}
整数を符号なし整数に変換したい場合は、整数が決して負にならないことがわかっている状況にあるか、すべての負の値を絶対値(つまり、符号なしの値)に変換したい場合があります。 。この変換を絶対値に行うのは簡単です。
_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;
_