2011-08-07 15 views

Odpowiedz

32

NSInteger i NSUInteger są po prostu typedef dla prymitywnych typów całkowitych:

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

Jako takie, nie trzeba do „konwersji” między nimi. Prosta obsada powinna wystarczyć. Na przykład:

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

Gratzi, twój drugi kodek tam pracował dla mnie! –

+3

Czy rzucanie podpisanej int do niepodpisanej int nie jest niebezpieczne? Czytałem, że może to spowodować uszkodzenie, ponieważ bit znaku może być interpretowany jako wartość w unsigned ints? Czy C robi wszystko, aby temu zapobiec? –

8

Ponieważ może to być przydatne dla innych osób, które natkną się na ten problem, poniżej znajduje się tabela przedstawiająca faktyczny efekt przesyłania. Wartości te zostały pobrane z debuggera jako wartości szesnastkowe. Wybierz odpowiednio, ponieważ rzutowanie powoduje efekty. W przypadku wersji 32-bitowej odetnij dolną część: ffffffff i dla 16-bitowego oderwania dolnego ffffffffffff. Zauważ też, że -1 to zawsze 0xffffffffffffffffff.

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

Jeżeli jesteś pewien, że twój NSInteger jest większa lub równa zeru, wystarczy rzucić go jako NSUInteger. Nie powinieneś rzutować na NSUInteger, jeśli twoja NSInteger reprezentuje liczbę ujemną, ponieważ może to prowadzić do niespójności.

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

skutkuje

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

w NSObjCRuntime.H '#define NSUIntegerMax ULONG_MAX' ' NSLog (@ "ULONG_MAX:% lu" ULONG_MAX)' ULONG_MAX: 4294967295' 4294967295-30 + 1 = 4294967266 +1 powodu 'NSInteger ui = NSIntegerMax; 'ui = 1; ' ui = (NSUInteger) -1; ' –

0

Jeśli chce przekonwertować liczbę całkowitą bez znaku liczby całkowitej, albo jesteś w sytuacji, gdy wiesz, że całkowita nigdy nie będzie ujemny lub możesz chcieć przekonwertować wszystkie wartości ujemne na wartości bezwzględne (tj. wartości bez znaku). Robi to konwersję do wartości bezwzględnej jest prosta:

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

fabs() jest funkcją C, która zwraca wartość bezwzględną dla każdego pływaka. W tym przypadku wartość myUnsignedInteger będzie miała wartość 100.

Możliwe są przypadki użycia dla takiej funkcji, w których należy wskazać wartości ujemne w innym formacie. Na przykład w księgowości liczby ujemne są wyświetlane w nawiasach:

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

Należy zauważyć, że z technicznego punktu widzenia, można po prostu przypisać NSInteger do NSUInteger-to nawet nie wymagają lanego ale gdy NSInteger jest ujemny, że NSUInteger zwróci bardzo dużą liczbę dodatnią, co jest oczywiście wysoce niepożądanym efektem ubocznym:

NSUInteger myUnsignedInteger = mySignedInteger;