0

Horstmann の Core Java を読んでいます。

これは例です:

    byte nx = (byte)300;
    System.out.println(nx);

結果は 44 です。なぜだかわかりません。2 つのバリエーションがあると思います。1) すべてが台無しになり、完全なゴミが得られます。2) いくつかのロジックがあります。

受け取ったのは 44 であると本に書かれているので、私は 2 番目のバリアントに傾倒しています。そのため、その背後にはいくつかのアルゴリズムがあります。

理解するのを手伝ってくれませんか。

4

3 に答える 3

3

へのキャストbyteは、最下位 8 ビットのみを保持します。バイナリの 300 (intここでは) は

00000000 00000000 00000001 00101100

最後の 8 ビットを保持すると、256 を表す最上位の 1 (およびその前のすべて) が破棄されるため、残りの値は 300 - 256 = 44 になります。

00101100
于 2013-08-05T19:24:08.663 に答える
0

バイト データ型の長さはわずか 8 ビットで、10 進数の 300 には 9 ビットが必要です。キャストすると、切り捨てられて左端のビットが切り捨てられ、10 進数 44 の 2 進数表現が残ります。

類推が必要な場合は、35.6 のような float から int へのキャストを考えてみてください。int には小数点以下の桁数を指定できないため、このキャストでは float から '.6' が切り捨てられ、戻り値では完全に無視されます。

于 2013-08-05T19:29:01.740 に答える
0

300 の 2 進展開を見てください。

100101100

byteここで、最後の 8 ビット ( Javaの a の幅) を除くすべてを切り取ります。

00101100

これを整数値に変換します。

44

符号ビットに注意する必要があることに注意してください。256 で割った余りを単純にとることはできません。たとえば、次のようになります。

byte nx = (byte)400;
System.out.println(nx);

-112 (144 ではない) を出力します。それは、キャスト後のビット パターンが

10010000

左端 (8 番目) のビットは、-112 の 2 の補数表現の符号ビットとして扱われます。

于 2013-08-05T19:24:51.387 に答える