2016-02-11 6 views
9

Xcode narzeka następujący wiersz:Integer dosłowne przepełnienia jeśli jest przechowywany w „INT”

let primary = UInt32(0x8BC34AFF) 

z tym komunikatem o błędzie:

Integer literal '2344831743' overflows when stored into 'Int' 

widzę, że przelewa podpisaną całkowitą, ale celowo używany UInt32. Moje pytanie brzmi bardziej "jak to możliwe" zamiast "jak to naprawić".

+1

Ten błąd może być bardzo podstępne - może to być zależne od platformy docelowej, dzięki czemu program może skompilować i uruchomić grzywny dla iPhone 6, a następnie po włączeniu symulatora do iPhone 5 to wyskakuje błąd i zapobiega kompilacji! Na szczęście poniższa odpowiedź rozwiązuje problem i wyjaśnia tło 32-bitowe a 64-bitowe. – RenniePet

Odpowiedz

15

UInt32(0x8BC34AFF) tworzy UInt32, wywołując inicjator. UInt32 initializer dzwonisz jest:

init(_ v: Int) 

Problemem jest to, że w urządzeniu 32-bitowym (iPhone5 i wcześniej), typ Int wynosi 32 bitów. Tak więc stała, którą przechodzisz 0x8BC34AFF przepełnia Int, którą przechodzisz do inicjalizatora UInt32.

Sposób mieć tę pracę obu urządzeń 32-bitowych i 64-bitowych jest do oddania całkowitą dosłownego do typu:

let primary = 0x8BC34AFF as UInt32 

Alternatywnie zadeklarować zmienną być UInt32 i po prostu przypisać stałą :

let primary:UInt32 = 0x8BC34AFF 
+0

Dzięki za to. Mój kod został zbudowany i działał dobrze aż do teraz, kiedy z jakiegoś powodu nagle nie było dobrze. Nie zmieniłem urządzeń ani niczego, chociaż może to być pierwszy raz, kiedy próbowałem budować to urządzenie z Xcode 9. – Oded

+1

Musiałem zrobić '1489064651000 jako UInt64' – 3lvis

Powiązane problemy