2016-05-16 4 views

Antwort

3

Wenn Sie die bitweisen Verschiebeoperatoren verwenden, müssen Sie die Größe des zu verschiebenden Werts in Bits um kleiner als verschieben. In diesem Fall versuchen Sie, eine UInt8 um 8 Bits zu verschieben - was außerhalb dieses Bereichs liegt.

Der Grund, warum es für print(5<<8) -> 1280 funktioniert, ist, weil Swift diese Typen von Int ableitet - und deshalb wird es entweder 32 oder 64 Bit sein, abhängig von der Plattform. Weil 8 weniger ist, wird es funktionieren.

Wenn Sie werfen ausdrücklich die 5-UInt8, werden Sie ein Compiler Fehler sagen erhalten:

jedoch

Shift-Betrag größer oder gleich Typ Größe in Bits, Es scheint, Swift ist nicht in der Lage, den gleichen Compilerfehler für Arrays zu liefern - nur einen Laufzeitfehler.

Die Lösung besteht daher darin, mit größeren Typen zu arbeiten. Abhängig davon, für was Sie diesen Code verwenden, möchten Sie möglicherweise ein UInt16 Array verwenden.

var test: [UInt16] = [5, 6, 7, 8] 

Oder Sie, wenn Sie die verschobenen Werte unabhängig von der Array sind, können Sie werfen sie einfach auf einen größeren Typ vor der Verschiebung:

print(UInt16(test[0])<<8) 

Obwohl Sie, dass Apple recommends you use Int für Integer-Typen beachten sollten , auch wenn Ihre Werte bekanntlich nicht negativ sind - es sei denn, Sie müssen speziell mit Typen einer festen Größe arbeiten.

+0

Thank u so much! Es ist sehr klar! – HungCLo

+0

@HungCLo Glücklich zu helfen :) – Hamish

3

Sie können ein UInt8 nicht um 8 oder mehr Bits verschieben. Wenn Sie die Konsole überprüfen, wird Ihnen die Swift-Laufzeit das sagen.

fatal error: shift amount is larger than type size in bits 

Der Grund 5 << 8 Werke ist, weil 5 ein Int ist die in der Regel 32 oder 64 Bit groß ist.

Wenn Sie eine größere ganze Zahl ausgegeben werden soll, werfen den Wert vor der Verschiebung tun:

print(UInt32(test[0]) << 8) 
// ^^^^^^ 
+0

Sehr klar! Danke vielmals! – HungCLo

Verwandte Themen