左位移255(作为一个字节)
任何人都可以解释为什么以下不编译?
byte b = 255 << 1
错误:
常量值’510’无法转换为’字节’
我期待二进制中的以下内容:
1111 1110
类型转换困扰了我。
C#中的数字文字是int
,而不是byte
(并且位移将由编译器评估,因此只剩下510)。 因此,您尝试将值分配给不适合的byte
。 你可以使用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
不适合一个字节。
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.因此可以使用unchecked
转换来执行此操作!
255 << 1
会给你多个字节。
由于<<优先级高于&你可以保存括号:
byte b = 255 << 1 & 0xff;