使用左移将两个字节合并为 short

Combine two bytes to short using left-shift

我有一个高字节和一个低字节要转换为短字节。

我已经实现了这个,这似乎有效,但我对为什么有点困惑。 high_bytelow_byte 都被转换为 byte

short word = (short)(high_byte << 8 | low_byte);

在此代码中,high_byte << 8 是否应为零?然后我试了这个:

(byte)1 << 8

等于256,我认为应该是0。我想我显然遗漏了一些东西。

有人可以解释一下吗?

你可以这样做:

byte[] Bytes = new byte[2] { byte1, byte2 };
Convert.ToUInt16(Bytes);

为什么你期望最后一段代码等于0?您可以在 Immediate Window.

中检查类型
(1 << 8).GetType()

它returns System.Int32

<< 的结果至少是一个 int,所以不,someByte << 8 不会产生 0,因为结果适合 int。

如果您希望 (byte)1 << 8 将结果限定为一个字节,请使用 (byte)((1 << 8) & 255)。这将始终导致 0,所以你为什么想要那个...

另见 Left bit shifting 255 (as a byte)

来自 C# language specification,第 4.1.5 节:

The integral-type unary and binary operators always operate with signed 32-bit precision, unsigned 32-bit precision, signed 64-bit precision, or unsigned 64-bit precision:

...

For the binary << and >> operators, the left operand is converted to type T, where T is the first of int, uint, long, and ulong that can fully represent all possible values of the operand. The operation is then performed using the precision of type T, and the type of the result is T.

也就是说,无论何时将任何运算符应用于 C# 中的整数类型,结果始终至少为 32 位。对于其他运算符还有其他规则(在 ... 中给出),这些规则准确定义了最终类型的确定方式。


(顺便说一句,我认为这很重要,可以在 C# Reference 中提及,但如果我能在任何地方找到它,我会很震惊)