谁能解释为什么以下内容无法编译?
byte b = 255 << 1
错误:
常量值“510”不能转换为“字节”
我期待以下二进制文件:
1111 1110
类型转换难倒了我。
谁能解释为什么以下内容无法编译?
byte b = 255 << 1
错误:
常量值“510”不能转换为“字节”
我期待以下二进制文件:
1111 1110
类型转换难倒了我。
C# 中的数字文字是int
, not byte
(并且位移将由编译器评估,因此只剩下 510 )。因此,您试图为byte
不适合的 a 分配一个值。您可以使用 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
,并且 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。所以可以通过强制转换来做到这一点!
255 << 1
会给你超过一个字节。
由于 << 的优先级高于 & 您可以保存括号:
byte b = 255 << 1 & 0xff;