18

谁能解释为什么以下内容无法编译?

byte b = 255 << 1

错误:

常量值“510”不能转换为“字节”

我期待以下二进制文件:

1111 1110

类型转换难倒了我。

4

7 回答 7

36

C# 中的数字文字是int, not byte(并且位移将由编译器评估,因此只剩下 510 )。因此,您试图为byte不适合的 a 分配一个值。您可以使用 255 进行掩码:

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

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

您也可以使用uncheckedlassevk提到的:

byte b = unchecked((byte)(255 << 1));
于 2009-04-10T14:32:07.540 回答
8

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

于 2009-04-10T14:30:31.130 回答
5
byte b = 0xff & (255 << 1);
于 2009-04-10T14:33:19.800 回答
5

<<运算符的结果是Int32,而不是您放入其中的内容。

您需要转换班次的结果,而不是输入。此外,它会产生溢出(它毕竟大于一个字节),因此您需要指定您需要未经检查的强制转换。

换句话说,这将起作用:

Byte b = unchecked((Byte)(255 << 1));
于 2009-04-10T14:34:34.197 回答
3

你试过铸造它吗?

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

这是一种有趣的方法——如果将上面的代码包装在这样的unchecked块中,上面的代码就可以工作:

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

由于它unchecked的值被截断为预期值 254。所以可以通过强制转换来做到这一点!

于 2009-04-10T14:30:02.660 回答
1
255 << 1

会给你超过一个字节。

于 2009-04-10T14:29:48.433 回答
0

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

byte b = 255 << 1 & 0xff;
于 2009-04-10T14:36:29.900 回答