誰も次のことがコンパイルされない理由を説明できますか?左ビットシフト255(バイトとして)
byte b = 255 << 1
エラー:
Constant value '510' cannot be converted to a 'byte'
私はバイナリに次のように期待している:
1111 1110
型変換が私を困惑しています。
誰も次のことがコンパイルされない理由を説明できますか?左ビットシフト255(バイトとして)
byte b = 255 << 1
エラー:
Constant value '510' cannot be converted to a 'byte'
私はバイナリに次のように期待している:
1111 1110
型変換が私を困惑しています。
C#の数値リテラルは、byte
ではなく、int
です(ビットシフトはコンパイラによって評価されるため、510だけが残ります)。したがって、適合しないbyte
に値を割り当てようとしています。 255でマスクすることができます:
byte b = (255 << 1) & 0xFF
結果を8ビットにもう一度減らします。 Javaとは異なり、C#では、検出されずにオーバーフローが発生することはありません。基本的には510を1バイトに割り当てようとすると2つの賢明な選択肢があります:最大値でクランプしてから255を得るか、適合しないビットを捨てます。
あなたはまたlassevk mentionedとして、unchecked
を使用することができます。
byte b = unchecked((byte)(255 << 1));
255 << 1
は、複数のバイトを表示します。
キャストしましたか?
byte b = (byte)(255 << 1)
これは興味深いアプローチである - このようなunchecked
ブロックに包まれた場合は、上記のコードは動作します:
unchecked
{
byte b = (byte)(255 << 1);
}
それはunchecked
値の意図した値に切り捨てられているのでそれで、キャストでこれを行うことが可能です!
255を1ビットシフトしてから、それを1バイトに割り当てようとしています。 255 << 1 is 510
、および510は1バイトに収まりません。
byte b = 0xff & (255 << 1);
を<<
演算子の結果は、あなたがそれに入れ何、Int32
ではありません。
入力ではなくシフトの結果をキャストする必要があります。さらに、オーバーフローが発生します(バイト後のバイト数よりも大きいため)。チェックされていないキャストが必要であることを指定する必要があります。
つまり、これは動作します:
Byte b = unchecked((Byte)(255 << 1));
そして< <ので、あなたは括弧を保存することができます&よりも優先順位が高い:
byte b = 255 << 1 & 0xff;
なぜ私は255が8ビットとして格納されていると思っているのかわからない –
255個、上記のものはすべて:) – Joey
ここでは別のスレッドからプッシュしたので、それらのビット単位の操作はintを返します。 –