以下がコンパイルされない理由を誰か説明できますか?
byte b = 255 << 1
エラー:
定数値 '510' は 'byte' に変換できません
私はバイナリで次を期待しています:
1111 1110
型変換は私を困惑させました。
以下がコンパイルされない理由を誰か説明できますか?
byte b = 255 << 1
エラー:
定数値 '510' は 'byte' に変換できません
私はバイナリで次を期待しています:
1111 1110
型変換は私を困惑させました。
C# の数値リテラルはint
, notbyte
です (ビット シフトはコンパイラによって評価されるため、510 のみが残ります)。byte
したがって、適合しない値を に代入しようとしています。255 でマスクできます:
byte b = (255 << 1) & 0xFF
結果を再び8ビットに減らします。Java とは異なり、C# ではオーバーフローが検出されないままになることはありません。基本的に、バイトに 510 を割り当てようとすると、2 つの賢明なオプションがあります。最大値でクランプしてから 255 を取得するか、収まらないビットを破棄して、その場合は 254 を取得します。
lassevk が述べunchecked
たように、次のように使用することもできます。
byte b = unchecked((byte)(255 << 1));
255 を 1 ビットシフトしてから、バイトに割り当てようとしています。
255 << 1 is 510
、および 510 はバイトに収まりません。
byte b = 0xff & (255 << 1);
<<
演算子の結果は であり、Int32
入力したものではありません。
入力ではなく、シフトの結果をキャストする必要があります。さらに、オーバーフローが発生するため (結局 1 バイトよりも大きい)、未チェックのキャストが必要であることを指定する必要があります。
言い換えれば、これはうまくいきます:
Byte b = unchecked((Byte)(255 << 1));
キャストしてみましたか?
byte b = (byte)(255 << 1)
これは興味深いアプローチです。上記のコードは、次のunchecked
ようなブロックでラップされている場合に機能します。
unchecked
{
byte b = (byte)(255 << 1);
}
値はunchecked
意図した値の 254 に切り捨てられるため、キャストでこれを行うことができます。
255 << 1
1バイト以上を提供します。
<< は & よりも優先順位が高いため、括弧を保存できます。
byte b = 255 << 1 & 0xff;