使用左移将两个字节组合为短

本文关键字:字节 两个 组合 左移 | 更新日期: 2023-09-27 18:04:58

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

我已经实现了这一点,这似乎是有效的,但我有点困惑的原因。high_bytelow_byte均铸为byte s。

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

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

(byte)1 << 8

等于256,我认为应该是0。我想我显然漏掉了什么。

有人能解释一下吗?

使用左移将两个字节组合为短

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

整型一元和二元操作符总是使用有符号32位精度、无符号32位精度、有符号64位精度或无符号64位精度进行操作:

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

也就是说,无论何时对c#中的整型应用任何操作符,结果总是最小为32位。对于其他操作符,还有其他规则(在...中给出),这些规则精确地定义了如何确定最终类型。


(顺便说一句,我本以为这很重要,应该在c#参考中提到,但如果我能在任何地方找到它,我就被吹了)

为什么期望最后一段代码等于0?您可以在"立即窗口"中查看类型。

(1 << 8).GetType()

返回System.Int32

<<的结果最低限度是int型,所以不,someByte << 8不会产生0,因为结果适合int型。

如果您希望(byte)1 << 8将结果箝位到一个字节,请使用(byte)((1 << 8) & 255)。这将总是导致0,所以为什么你想要…

参见左位移位255(作为一个字节)。

你可以这样做:

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