2009-04-10 7 views
15

誰も次のことがコンパイルされない理由を説明できますか?左ビットシフト255(バイトとして)

byte b = 255 << 1 

エラー:

Constant value '510' cannot be converted to a 'byte'

私はバイナリに次のように期待している:

1111 1110 

型変換が私を困惑しています。

答えて

35

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)); 
+0

なぜ私は255が8ビットとして格納されていると思っているのかわからない –

+0

255個、上記のものはすべて:) – Joey

+4

ここでは別のスレッドからプッシュしたので、それらのビット単位の操作はintを返します。 –

1
255 << 1 

は、複数のバイトを表示します。

1

キャストしましたか?

byte b = (byte)(255 << 1) 

これは興味深いアプローチである - このようなuncheckedブロックに包まれた場合は、上記のコードは動作します:

unchecked 
{ 
    byte b = (byte)(255 << 1); 
} 

それはunchecked値の意図した値に切り捨てられているのでそれで、キャストでこれを行うことが可能です!

+0

-1あなたは、それをキャストすることはできませんコンパイルされません。 –

+0

あなたは(バイト)(255 << 1)を意味するのでしょうか? – finnw

+1

try:バイトb =(255 << 1)& 0xff; – Joel

8

255を1ビットシフトしてから、それを1バイトに割り当てようとしています。 255 << 1 is 510、および510は1バイトに収まりません。

5
byte b = 0xff & (255 << 1); 
5

<<演算子の結果は、あなたがそれに入れ何、Int32ではありません。

入力ではなくシフトの結果をキャストする必要があります。さらに、オーバーフローが発生します(バイト後のバイト数よりも大きいため)。チェックされていないキャストが必要であることを指定する必要があります。

つまり

、これは動作します:

Byte b = unchecked((Byte)(255 << 1)); 
0

そして< <ので、あなたは括弧を保存することができます&よりも優先順位が高い:

byte b = 255 << 1 & 0xff; 
関連する問題