2017-01-16 105 views
1

我使用Java编写程序,使用带零填充(>>>)运算符的右移。 以下程序一切都很好。在Java中使用零填充运算符右移(>>>)只使用“int”而不使用“byte”

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'。所以零位最终比位于“字节”的两个前导位要高得多。 –

+0

@David Wallace但是b是一个字节。操作员正在使用字节。虽然在操作之后它返回int,但在它之前它变成了63。可能是我错了,但我很困惑。 –

+0

你为什么说“之前”的操作变成了63?手术之后没有63。 '>>>'操作符作用于'int'表达式,而不是'byte',因此转换发生在操作之前。 –

回答

0

在每次操作之前,Java将byte,short或char操作数(变量或常量)都转换为int。然后在执行操作之后。

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

乘法操作之前B和C被转换在INT。所以结果是int。我们试图在字节d中存储int,这会导致编译错误。

同样的事情也发生在换班经营者身上。

int c = b>>>2; 

第一个b被转换为int。然后移位操作发生int。最终结果是一个整数。正如大卫华莱士所说:“所以零最终位于比字节的两个前导位更重要的位”。