使用左移将两个字节合并为 short
Combine two bytes to short using left-shift
我有一个高字节和一个低字节要转换为短字节。
我已经实现了这个,这似乎有效,但我对为什么有点困惑。 high_byte
和 low_byte
都被转换为 byte
。
short word = (short)(high_byte << 8 | low_byte);
在此代码中,high_byte << 8
是否应为零?然后我试了这个:
(byte)1 << 8
等于256
,我认为应该是0
。我想我显然遗漏了一些东西。
有人可以解释一下吗?
你可以这样做:
byte[] Bytes = new byte[2] { byte1, byte2 };
Convert.ToUInt16(Bytes);
为什么你期望最后一段代码等于0?您可以在 Immediate Window.
中检查类型
(1 << 8).GetType()
它returns System.Int32
。
<<
的结果至少是一个 int,所以不,someByte << 8
不会产生 0
,因为结果适合 int。
如果您希望 (byte)1 << 8
将结果限定为一个字节,请使用 (byte)((1 << 8) & 255)
。这将始终导致 0
,所以你为什么想要那个...
另见 Left bit shifting 255 (as a byte)。
来自 C# language specification,第 4.1.5 节:
The integral-type unary and binary operators always operate with signed 32-bit precision, unsigned 32-bit precision, signed 64-bit precision, or unsigned 64-bit precision:
...
For the binary <<
and >>
operators, the left operand is converted to type T
, where T
is the first of int
, uint
, long
, and ulong
that can fully represent all possible values of the operand. The operation is then performed using the precision of type T
, and the type of the result is T
.
也就是说,无论何时将任何运算符应用于 C# 中的整数类型,结果始终至少为 32 位。对于其他运算符还有其他规则(在 ...
中给出),这些规则准确定义了最终类型的确定方式。
(顺便说一句,我认为这很重要,可以在 C# Reference 中提及,但如果我能在任何地方找到它,我会很震惊)
我有一个高字节和一个低字节要转换为短字节。
我已经实现了这个,这似乎有效,但我对为什么有点困惑。 high_byte
和 low_byte
都被转换为 byte
。
short word = (short)(high_byte << 8 | low_byte);
在此代码中,high_byte << 8
是否应为零?然后我试了这个:
(byte)1 << 8
等于256
,我认为应该是0
。我想我显然遗漏了一些东西。
有人可以解释一下吗?
你可以这样做:
byte[] Bytes = new byte[2] { byte1, byte2 };
Convert.ToUInt16(Bytes);
为什么你期望最后一段代码等于0?您可以在 Immediate Window.
中检查类型(1 << 8).GetType()
它returns System.Int32
。
<<
的结果至少是一个 int,所以不,someByte << 8
不会产生 0
,因为结果适合 int。
如果您希望 (byte)1 << 8
将结果限定为一个字节,请使用 (byte)((1 << 8) & 255)
。这将始终导致 0
,所以你为什么想要那个...
另见 Left bit shifting 255 (as a byte)。
来自 C# language specification,第 4.1.5 节:
The integral-type unary and binary operators always operate with signed 32-bit precision, unsigned 32-bit precision, signed 64-bit precision, or unsigned 64-bit precision:
...
For the binary
<<
and>>
operators, the left operand is converted to typeT
, whereT
is the first ofint
,uint
,long
, andulong
that can fully represent all possible values of the operand. The operation is then performed using the precision of typeT
, and the type of the result isT
.
也就是说,无论何时将任何运算符应用于 C# 中的整数类型,结果始终至少为 32 位。对于其他运算符还有其他规则(在 ...
中给出),这些规则准确定义了最终类型的确定方式。
(顺便说一句,我认为这很重要,可以在 C# Reference 中提及,但如果我能在任何地方找到它,我会很震惊)