5

今日は、左シフト ビット演算子 ( ) について学習していました<<。私が理解しているように、左シフトビット演算子は、指定されたとおりにビットを左に移動します。また、シフトのために2を掛けることも知っています。しかし、「ビットをシフトする」の正確な意味と、値が異なる型で割り当てられたときに出力が異なるのはなぜですか?

以下の関数を呼び出すと、次のような出力が得られますSystem.out.println("b="+b); //Output: 0

そして私の質問は: b はどのようにして 0 になり、なぜ b は型キャストされるのですか?

public void leftshiftDemo()
{
    byte a=64,b;
    int i;
    i=a << 2;
    b=(byte)(a<<2);
    System.out.println("i="+i); //Output: 256    i.e 64*2^2
    System.out.println("b="+b); //Output: 0   how & why b is typecasted
}

更新(新しい疑い):

「1ビットを上位(ビット31または63)にシフトすると、値は負になります」とはどういう意味ですか. 例えば。

public void leftshifHighOrder()
{
    int i;
    int num=0xFFFFFFE;

    for(i=0;i<4;i++)
    {
        num=num<<1;
        System.out.println(num);
        /*
         * Output:
         * 536870908
         * 1073741816
         * 2147483632
         * -32   //how this is -ve?
         */
    }
}
4

5 に答える 5

6

Java で整数がバイトにキャストされると、最下位ビットのみが保持されます。

符号付き整数から整数型 T への縮小変換では、下位 n ビットを除くすべてのビットが単純に破棄されます。ここで、n は型 T を表すために使用されるビット数です。数値の大きさに関する情報が失われる可能性に加えて、 、これにより、結果の値の符号が入力値の符号と異なる場合があります。

この場合、バイト64は次のバイナリ表現を持ちます。

01000000

シフト演算子は、値を int に昇格します。

00000000000000000000000001000000

次に、それを 2 ビット左にシフトします。

00000000000000000000000100000000

次に、それをバイトにキャストして戻すため、最後の 8 ビットを除くすべてを破棄します。

00000000

したがって、最終的なバイト値は0. ただし、整数はすべてのビットを保持するため、最終的な値は実際には256.

于 2013-11-07T15:03:01.403 に答える
1
i = a << 2;

メモリ内:

  • a (8 ビット) をレジストリ R1 (32 ビット) にロードする
  • レジストリ R1 を左 2 桁にシフト
  • レジストリ R1 (32 ビット) を変数 i (32 ビット) に割り当てます。

b = (byte)(a << 2);

メモリ内:

  • a (8 ビット) をレジストリ R1 (32 ビット) にロードする
  • レジストリ R1 を左 2 桁にシフト
  • レジストリ R1 (32 ビット) を変数 b (8 ビット) に割り当てます。<-これがキャスト(バイト)が必要な理由であり、シフト操作の最後の8ビットのみを取得する理由です
于 2013-11-07T15:06:11.490 に答える
0

ビットをシフトする正確な意味は、まさにそのように聞こえます。:-) それらを左にシフトします。

0011 = 3

0011 << 1 = 0110

0110 = 6

于 2013-11-07T15:05:44.847 に答える
0

Java のさまざまなデータ型とその範囲について読む必要があります。

簡単な言葉で説明しましょう。

byte a=64,b;
int i;
i=a << 2;
b=(byte)(a<<2);

Java の「バイト」は符号付きの 2 の補数の整数です。-128 から 127 までの値を格納できます。これを行うと、

i = a << 2;

「a」を 2 ビット左シフトし、値は 64*2*2 = 256 と想定されます。「i」は「int」型であり、Java の「int」はその値を表すことができます。

再びシフトとタイプキャストを左にすると、

b=(byte)(a<<2);

下位 8 ビットを保持するため、値は 0 です。

これは、Java のさまざまなプリミティブ型について読むことができます。 http://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html

于 2013-11-07T15:53:50.537 に答える