2016-06-01 15 views
1

Wenn ich eine ushort-Variable habe, die 0xFFAA ist und ich werde das mit 8 Bits verschieben, werde ich eine ganze Zahl bekommen, nicht eine vorzeichenlose Abkürzung, warum? Hier ist ein Bild, das Sie mehr klar zu machen, was ich meine:Linke Verschiebung auf einem vorzeichenlosen Kurzschluss ohne Überlauf in eine ganze Zahl

enter image description here

Gibt es einen Weg aus dieser links verschieben, um eine 16-Bit-Variable zu erhalten, ohne die int in einen unsigned short zu Gießen?

+0

Vielleicht hat es etwas mit UINT zu tun, die nicht Teil des Wesens CLS? 'Der Typ UInt16 ist nicht CLS-kompatibel. Der alternative CLS-Typ ist Int32. Int16 kann stattdessen verwendet werden, um einen UInt16-Wert zu ersetzen, der von Null bis MaxValue reicht. Weitere Informationen zur CLS-Kompatibilität finden Sie unter Allgemeine Sprachspezifikation. –

+0

'test' ist hier kein Muss; es ist ein 'int'. 'var' Typisierung mit ganzzahligen Konstanten ergibt immer' int'. Auch ohne C# 's Regeln für Typ-Promotion im Schichtbetrieb gibt es keinen Grund, eine 'ushort' zu erwarten. – user5090812

+0

Das gleiche passiert, wenn ich ushort anstelle von var verwende. – user3149497

Antwort

1

Wenn Sie sicherstellen möchten, dass nur die unteren 16 Bits einer Variablen gesetzt sind, können Sie mit 0xFFFF Maske logisch mit AND:

var supposed = (test << 8) & 0xFFFF; 
+0

Danke, Ihre Lösung funktioniert wie erwartet. Kannst du mir vielleicht sagen, warum mein Weg nicht so funktioniert wie angenommen? – user3149497

+0

Wie von user5090812 erwähnt, ist der Test ein int, so dass es um 8 Bits nach oben geht und 0x00FFAA00 ergibt. Das Angeben eines hexadezimalen konstanten Wertes mit 4 Ziffern macht den Test nicht zu einer Übung. – samgak