Kombiniere zwei Bytes zu kurz mit der linken Verschiebung

8

Ich habe ein High-Byte und ein Low-Byte, das ich gerne in short umwandeln würde.

Ich habe das implementiert, was zu funktionieren scheint, aber ich bin ein wenig verwirrt warum. Sowohl high_byte als auch low_byte werden als byte s umgewandelt.

%Vor%

Sollte high_byte << 8 in diesem Code null sein? Dann habe ich das versucht:

%Vor%

was gleich 256 ist, was meiner Meinung nach 0 sein sollte. Ich denke, ich vermisse eindeutig etwas.

Könnte jemand bitte erklären?

    
jackfrost9p 27.07.2015, 13:37
quelle

4 Antworten

13

Aus der C # -Sprachspezifikation , Abschnitt 4.1.5:

  

Die unären und binären Operatoren des Integraltyps arbeiten immer mit 32-Bit-Vorzeichen mit Vorzeichen, 32-Bit-Vorzeichen ohne Vorzeichen, 64-Bit-Vorzeichen mit Vorzeichen oder 64-Bit-Vorzeichen ohne Vorzeichen:

     

...

     

Für die binären Operatoren << und >> wird der linke Operand in den Typ T konvertiert, wobei T der erste Wert von int , uint , long und ulong ist. das kann alle möglichen Werte des Operanden vollständig darstellen. Die Operation wird dann mit der Genauigkeit vom Typ T ausgeführt, und der Typ des Ergebnisses ist T .

Das heißt, jedes Mal, wenn Sie Operatoren auf ganzzahlige Typen in C # anwenden, ist das Ergebnis immer ein Minimum von 32 Bits. Es gibt andere Regeln (in ... angegeben) für andere Operatoren, die genau definieren, wie die endgültigen Typen bestimmt werden.

(Abgesehen davon hätte ich gedacht, dass dies wichtig genug war, um es in der C # -Referenz zu erwähnen aber ich bin ausgelöscht, wenn ich es irgendwo dort finden kann

    
Damien_The_Unbeliever 27.07.2015, 13:46
quelle
4

Warum erwarten Sie, dass das letzte Stück Code gleich 0 ist? Sie können den Typ im Direktfenster überprüfen.

%Vor%

Es gibt System.Int32 zurück.

    
Kapol 27.07.2015 13:42
quelle
4

Das Ergebnis von << ist minimal ein int, also nein, someByte << 8 liefert nicht 0 , da das Ergebnis in ein int passt.

Wenn (byte)1 << 8 das Ergebnis auf ein Byte beschränken soll, verwenden Sie (byte)((1 << 8) & 255) . Dies führt immer zu 0 , also warum Sie das wollen ...

Siehe auch Linkes Bit, das 255 (als Byte) verschiebt .

    
CodeCaster 27.07.2015 13:42
quelle
1

Du könntest es so machen:

%Vor%     
Gnqz 27.07.2015 13:42
quelle

Tags und Links