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

时间:2015-07-27 13:37:43

标签: c# casting bit-shift

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

我已经实现了这个,这似乎有效,但是我对它的原因有点困惑。 high_bytelow_byte都投放为byte

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

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

(byte)1 << 8

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

有人可以解释一下吗?

4 个答案:

答案 0 :(得分:13)

来自C# language specification,第4.1.5节:

  

积分型一元和二元运算符始终使用带符号的32位精度,无符号32位精度,带符号的64位精度或无符号64位精度运行:

     

...

     

对于二进制<<>>运算符,左操作数将转换为T类型,其中Tint中的第一个,{{ 1}},uintlong可以完全表示操作数的所有可能值。然后使用类型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,所以为什么你想要...

另见Left bit shifting 255 (as a byte)

答案 3 :(得分:1)

你可以这样做:

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