使用左移将两个字节组合成短整型

11

我有一个高字节和一个低字节,我想将它们转换为短整型。

我已经实现了以下代码,似乎能够正常工作,但我对其中的原理还有一些困惑。两个变量 high_bytelow_byte 都被强制转换为 byte 类型。

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

在这段代码中,high_byte << 8 应该为零吗?然后我尝试了这个:

(byte)1 << 8

结果是256,我原以为应该是0。我想我显然错过了什么。

请问有人能解释一下吗?


2
你可能想要使用(byte)(1 << 8)代替(byte)1 << 8。 - adv12
4个回答

14

来自C#语言规范,第4.1.5节:

整数类型的一元和二元运算符总是使用带符号32位精度、无符号32位精度、带符号64位精度或无符号64位精度进行操作:

...

对于二进制<<>>运算符,左操作数转换为类型T,其中T是可以完全表示操作数所有可能值的intuintlongulong中的第一个。然后使用类型T的精度执行操作,并且结果的类型为T

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


顺便说一下,我本以为这很重要,应该在C#参考中提到,但我找不到任何相关内容。


4
<<的结果至少是int类型,因此someByte << 8不会等于0,因为结果适合int类型。
如果想要(byte)1 << 8将结果夹紧至一个字节,使用(byte)((1 << 8) & 255)。这始终会得出0,所以你为什么需要这个...
另请参见左移字节255位

4

你为什么期望最后一段代码等于0?你可以在即时窗口中检查类型。

(1 << 8).GetType()

它返回 System.Int32

1
你可以这样做:

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

4
他并不是在询问如何实现这个功能,他已经有能够运行的代码了。他想知道为什么它有效。 - Rawling

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接