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.
Sollte high_byte << 8
in diesem Code null sein? Dann habe ich das versucht:
was gleich 256
ist, was meiner Meinung nach 0
sein sollte. Ich denke, ich vermisse eindeutig etwas.
Könnte jemand bitte erklären?
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 TypT
konvertiert, wobeiT
der erste Wert vonint
,uint
,long
undulong
ist. das kann alle möglichen Werte des Operanden vollständig darstellen. Die Operation wird dann mit der Genauigkeit vom TypT
ausgeführt, und der Typ des Ergebnisses istT
.
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
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 .