Chr*_*s S 16 c# bit-manipulation bit-shift
任何人都可以解释为什么以下不编译?
byte b = 255 << 1
Run Code Online (Sandbox Code Playgroud)
错误:
常量值'510'无法转换为'字节'
我期待二进制中的以下内容:
1111 1110
Run Code Online (Sandbox Code Playgroud)
类型转换困扰了我.
Joe*_*oey 35
C#中的数字文字是int
,而不是byte
(并且位移将由编译器评估,因此仅剩下510).因此,您尝试将值分配给byte
不适合的值.你可以用255掩码:
byte b = (255 << 1) & 0xFF
Run Code Online (Sandbox Code Playgroud)
将结果再次减少到8位.与Java不同,C#不允许溢出被检测到.在尝试将510分配给一个字节时,基本上你有两个明智的选择:要么钳制到最大值,要么得到255,要么扔掉不合适的位,在这种情况下你得到254.
您也可以使用unchecked
,如lassevk所述:
byte b = unchecked((byte)(255 << 1));
Run Code Online (Sandbox Code Playgroud)
<<
操作员的结果是Int32
,而不是你投入的.
你需要转换移位的结果,而不是输入.另外,它会产生溢出(它大于一个字节),所以你需要指定你需要一个未经检查的强制转换.
换句话说,这将有效:
Byte b = unchecked((Byte)(255 << 1));
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
27023 次 |
最近记录: |