任何人都可以解释为什么以下不编译?
byte b = 255 << 1
错误:
常量值'510'无法转换为'byte'
我期待二进制文件中的以下内容:
1111 1110
类型转换困扰了我。
答案 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;