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

Chr*_*s S 16 c# bit-manipulation bit-shift

任何人都可以解释为什么以下不编译?

byte b = 255 << 1
Run Code Online (Sandbox Code Playgroud)

错误:

常量值'510'无法转换为'字节'

我期待二进制中的以下内容:

1111 1110
Run Code Online (Sandbox Code Playgroud)

类型转换困扰了我.

Joe*_*oey 35

C#中的数字文字是int,而不是byte(并且位移将由编译器评估,因此仅剩下510).因此,您尝试将值分配给byte不适合的值.你可以用255掩码:

byte b = (255 << 1) & 0xFF
Run Code Online (Sandbox Code Playgroud)

将结果再次减少到8位.与Java不同,C#不允许溢出被检测到.在尝试将510分配给一个字节时,基本上你有两个明智的选择:要么钳制到最大值,要么得到255,要么扔掉不合适的位,在这种情况下你得到254.

您也可以使用unchecked,如lassevk所述:

byte b = unchecked((byte)(255 << 1));
Run Code Online (Sandbox Code Playgroud)

  • 应该注意的是,当我从另一个线程推送到这里时,即使你有两个字节,对它们的任何按位操作都将返回一个int. (4认同)

Ste*_*eve 8

您将255移位1位,然后尝试将其分配给一个字节. 255 << 1 is 510,510不适合一个字节.


ang*_*son 5

<<操作员的结果是Int32,而不是你投入的.

你需要转换移位的结果,而不是输入.另外,它会产生溢出(它大于一个字节),所以你需要指定你需要一个未经检查的强制转换.

换句话说,这将有效:

Byte b = unchecked((Byte)(255 << 1));
Run Code Online (Sandbox Code Playgroud)