2017-01-16 2 views
1

Javaでプログラムを書いて、ゼロシフス(>>>)演算子で右シフトを使用します。 次のプログラムではすべてが良いです。Javaのゼロ充填演算子を使用した右シフト( ">>>")は、 "バイト"ではなく "int"でのみ動作します

class First 
{ 
     public static void main(String[] args) 
     { 
       int b = -1; 
       int c = b>>>2; 
       System.out.println(b); 
       System.out.println(c); 
     } 
} 

出力は次のとおりです。

-1 
1073741823 

すべてが上記のプログラムでは良いです。私はバイトのために同じプログラムを書くなら:

class First 
{ 
     public static void main(String[] args) 
     { 
       byte b = -1; 
       byte c = (byte)(b>>>2); 
       System.out.println(b); 
       System.out.println(c); 
     } 
} 

出力は次のとおりです。

-1 
-1 

それはむしろ「>>>」よりも、「>>」オペレータの作業のように見えます。私の期待される出力は:

-1 
63 

その背後にある概念を説明してください。

+0

'(b >>> 2)'の型は 'int'です。したがって、ゼロは、「バイト」の2つの先頭ビットよりもはるかに重要なビットになります。 –

+0

@David Wallaceしかし、bはバイトです。オペレータはバイト単位で動作しています。操作後はintを返しますが、その前には63になります。私は間違っているかもしれませんが、私は混乱しています.. –

+0

なぜ "前に"それは63になる操作を言うのですか?操作後63までは何もありません。 '>>>'演算子は 'byte'ではなく' int'式に作用するので、変換は操作の前に行われます。 –

答えて

0

各操作の前に、Javaはbyte、shortまたはcharオペランド(変数または定数の両方)をintに変換します。その後、操作が実行されます。

byte b = 2, c = 3; 
byte d = b * c; //Compilation error 

bとcの両方がintで変換されます。結果はintだった。 intをバイトdに格納しようとしましたが、コンパイルエラーです。

シフト演算子でも同じことが起こります。

int c = b>>>2; 

最初にbがintに変換されます。次に、シフト操作はintで行われます。最終結果はintです。 David Wallace氏は次のように述べています。「ゼロはバイトの2つの先頭ビットよりもはるかに重要なビットになります。

関連する問題