使用左移将两个字节组合为短
本文关键字:字节 两个 组合 左移 | 更新日期: 2023-09-27 18:04:58
我有一个高字节和一个低字节,我想转换为短。
我已经实现了这一点,这似乎是有效的,但我有点困惑的原因。high_byte
和low_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
类型,其中T
是int
、uint
、long
和ulong
中第一个可以完全表示该操作数所有可能值的类型。然后使用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);