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

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

byte b = 255 << 1 

错误:

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

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

 1111 1110 

类型转换困扰了我。

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

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

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

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

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

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

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

<<运算符的结果是Int32 ,而不是你输入的内容。

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

换句话说,这将有效:

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

你试过铸造吗?

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

这是一个有趣的方法 - 如果包含在这样的unchecked块中,上面的代码将起作用:

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

由于unchecked该值将被截断为预期值254.因此可以使用unchecked转换来执行此操作!

 255 << 1 

会给你多个字节。

由于<<优先级高于&你可以保存括号:

 byte b = 255 << 1 & 0xff;