Próbuję przekonwertować NSInteger na NSUInteger, a ja googlowałem i nie znalazłem prawdziwej odpowiedzi. Jak to zrobić?Konwertuj NSInteger na NSUInteger?
Odpowiedz
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;
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
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
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
}
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; ' –
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;
- 1. Konwertuj NSInteger na NSIndexpath
- 2. Konwertuj NSString na NSInteger?
- 3. Jak mogę odwrócić kolejność bajtów NSInteger lub NSUInteger w celu-c
- 4. Jak przekonwertować NSInteger na NSTimeInterval
- 5. Jak przekonwertować NSIndexPath na NSInteger?
- 6. jak przekonwertować NSinteger na ciąg
- 7. Dołącz NSInteger do NSMutableData
- 8. Jak przekonwertować wartość NSUInteger na wartość int w ObjectC?
- 9. Xcode iOS: Konwertuj int na NSString
- 10. Czy powracający NSNotFound dla NSUInteger jest wskazany?
- 11. Używanie wielu wyliczeń NSUInteger jako parametru metody
- 12. Konwertuj NA na poziom czynnika
- 13. Konwertuj CSS na HTML
- 14. Konwertuj obraz na XAML?
- 15. Konwertuj System.Windows.Media.Pen na System.Drawing.Pen
- 16. Konwertuj ciąg na LatLng
- 17. Konwertuj BytesIO na Plik
- 18. Konwertuj tablicę na JSON
- 19. Konwertuj klasę na rozszerzenie
- 20. Konwertuj wielokąt na trójkąty
- 21. Konwertuj datatable na datareader
- 22. Konwertuj Actionscript na JavaScript
- 23. Konwertuj system.data.linq.binary na bajt []
- 24. Konwertuj bajt [] na sbyte []
- 25. Konwertuj EntityReference na Entity
- 26. Konwertuj na wyliczenie
- 27. Konwertuj ciąg na SocketAddr
- 28. Konwertuj null na ciąg
- 29. Konwertuj Maildir na mbox
- 30. Konwertuj Char na Int
Gratzi, twój drugi kodek tam pracował dla mnie! –
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? –