关于c#:左移位255(作为一个字节)

Left bit shifting 255 (as a byte)

有人能解释一下为什么以下内容不能编译吗?

1
byte b = 255 << 1

错误:

Constant value '510' cannot be converted to a 'byte'

我期待下面的二进制代码:

1
1111 1110

类型转换让我很困惑。


C中的数字字面值是int,而不是byte(编译程序将计算位移,因此只剩下510位)。因此,您试图为不适合的byte赋值。您可以使用255进行遮罩:

1
byte b = (255 << 1) & 0xFF

将结果再次减少到8位。与Java不同,C.*不允许溢出被未检测到。基本上,当试图将510赋给一个字节时,您有两个明智的选择:要么钳制最大值,然后得到255,要么丢弃不合适的位,在这种情况下,得到254。

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

1
byte b = unchecked((byte)(255 << 1));


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


<<运算符的结果是Int32,而不是您输入的结果。

您需要转换移位的结果,而不是输入。此外,它将产生溢出(它大于一个字节后的所有),因此您需要指定您需要一个未选中的强制转换。

换句话说,这将起作用:

1
byte b = unchecked((byte)(255 << 1));

1
byte b = 0xff & (255 << 1);

你试过铸造它吗?

1
byte b = (byte)(255 << 1)

这是一种有趣的方法-如果将上述代码包装在这样的unchecked块中,则可以使用:

1
2
3
4
unchecked
{
    byte b = (byte)(255 << 1);
}

因为它是unchecked,所以值被截断为预期值254。所以用石膏做这个是可能的!


1
255 << 1

将为您提供多个字节。


由于<<的优先级高于&;您可以保存括号:

1
byte b = 255 << 1 & 0xff;