18

以下がコンパイルされない理由を誰か説明できますか?

byte b = 255 << 1

エラー:

定数値 '510' は 'byte' に変換できません

私はバイナリで次を期待しています:

1111 1110

型変換は私を困惑させました。

4

7 に答える 7

36

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));
于 2009-04-10T14:32:07.540 に答える
8

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

于 2009-04-10T14:30:31.130 に答える
5
byte b = 0xff & (255 << 1);
于 2009-04-10T14:33:19.800 に答える
5

<<演算子の結果は であり、Int32入力したものではありません。

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

言い換えれば、これはうまくいきます:

Byte b = unchecked((Byte)(255 << 1));
于 2009-04-10T14:34:34.197 に答える
3

キャストしてみましたか?

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

これは興味深いアプローチです。上記のコードは、次のuncheckedようなブロックでラップされている場合に機能します。

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

値はunchecked意図した値の 254 に切り捨てられるため、キャストでこれを行うことができます。

于 2009-04-10T14:30:02.660 に答える
1
255 << 1

1バイト以上を提供します。

于 2009-04-10T14:29:48.433 に答える
0

<< は & よりも優先順位が高いため、括弧を保存できます。

byte b = 255 << 1 & 0xff;
于 2009-04-10T14:36:29.900 に答える