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

时间:2009-04-10 14:26:09

标签: c# bit-manipulation bit-shift

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

byte b = 255 << 1

错误:

  

常量值'510'无法转换为'byte'

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

1111 1110

类型转换困扰了我。

7 个答案:

答案 0 :(得分:35)

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

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

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

您也可以unchecked使用byte b = unchecked((byte)(255 << 1));

{{1}}

答案 1 :(得分:8)

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

答案 2 :(得分:5)

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

答案 3 :(得分:5)

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

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

换句话说,这将有效:

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

答案 4 :(得分:3)

你试过投了吗?

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

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

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

由于它是unchecked,因此该值被截断为预期的值254.因此可以使用强制转换执行此操作!

答案 5 :(得分:1)

255 << 1

会给你多个字节。

答案 6 :(得分:0)

因为&lt;&lt;优先级高于&amp;你可以保存括号:

byte b = 255 << 1 & 0xff;