Left bit shifting 255 (as a byte)
有人能解释一下为什么以下内容不能编译吗?
1 | byte b = 255 << 1 |
错误:
Constant value '510' cannot be converted to a 'byte'
我期待下面的二进制代码:
1 | 1111 1110 |
类型转换让我很困惑。
C中的数字字面值是
1 | byte b = (255 << 1) & 0xFF |
将结果再次减少到8位。与Java不同,C.*不允许溢出被未检测到。基本上,当试图将510赋给一个字节时,您有两个明智的选择:要么钳制最大值,然后得到255,要么丢弃不合适的位,在这种情况下,得到254。
您也可以使用
1 |
您将255移动1位,然后尝试将其分配到一个字节。
您需要转换移位的结果,而不是输入。此外,它将产生溢出(它大于一个字节后的所有),因此您需要指定您需要一个未选中的强制转换。
换句话说,这将起作用:
1 |
1 | byte b = 0xff & (255 << 1); |
你试过铸造它吗?
1 | byte b = (byte)(255 << 1) |
这是一种有趣的方法-如果将上述代码包装在这样的
1 2 3 4 |
因为它是
1 | 255 << 1 |
将为您提供多个字节。
由于<<的优先级高于&;您可以保存括号:
1 | byte b = 255 << 1 & 0xff; |