我有一个高字节和一个低字节我想转换为short。
我已经实现了这个,这似乎有效,但是我对它的原因有点困惑。 high_byte
和low_byte
都投放为byte
。
short word = (short)(high_byte << 8 | low_byte);
在此代码中,high_byte << 8
应该为零吗?然后我尝试了这个:
(byte)1 << 8
等于256
,我认为应该是0
。我想我显然错过了一些东西。
有人可以解释一下吗?
答案 0 :(得分:13)
来自C# language specification,第4.1.5节:
积分型一元和二元运算符始终使用带符号的32位精度,无符号32位精度,带符号的64位精度或无符号64位精度运行:
...
对于二进制
<<
和>>
运算符,左操作数将转换为T
类型,其中T
是int
中的第一个,{{ 1}},uint
和long
可以完全表示操作数的所有可能值。然后使用类型ulong
的精度执行操作,结果类型为T
。
也就是说,无论何时将任何运算符应用于C#中的整数类型,结果始终至少为32位。其他运算符还有其他规则(在T
中给出),它们确切地定义了最终类型的确定方式。
(顺便说一句,我已经认为这很重要,可以在C# Reference中提及,但如果我能在任何地方找到它,我就会受到打击。
答案 1 :(得分:4)
为什么你希望最后一段代码等于0?您可以在立即窗口中检查类型。
(1 << 8).GetType()
返回System.Int32
。
答案 2 :(得分:4)
<<
的结果最小为int,所以不,someByte << 8
不会产生0
,因为结果适合int。
如果您希望(byte)1 << 8
将结果限制为一个字节,请使用(byte)((1 << 8) & 255)
。这将始终导致0
,所以为什么你想要...
答案 3 :(得分:1)
你可以这样做:
byte[] Bytes = new byte[2] { byte1, byte2 };
Convert.ToUInt16(Bytes);