2015-05-11 55 views
1

有人可以解释为什么我不能以这种方式乘以两个字节?乘以两个字节

byte a = 1; 
byte b = 1; 
byte c = a*b; 

byte a = 1; 
byte b = 1; 
short c = a*b; 

为什么我必须这样做,以这种方式?

byte a = 1; 
byte b = 1; 
byte c = (byte)(a*b); 

byte a = 1; 
byte b = 1; 
int/double/float/long c = a*b; 
+1

认为'255 * 255 = 65535',它太大而不适合在一个字节内...... –

+1

@MarcB'255'太大而不适合'byte'(它用Java签名),' 255 * 255'是'65025'。 – rgettman

+0

这是一种不一致的语言。两个'int'的乘积不能保证适合'int',但是'int = int * int'是允许的,而不需要强制转换。 – khelwood

回答

2

两个字节的产品不一定适合一个字节。所以Java需要你告诉它,你知道你在做什么,并确认在溢出的情况下你会得到低位。

+0

谢谢:)我现在明白了! – Mateusz

+1

这不是原因。通过这个推理,乘以2'int's会迫使你分配一个'long'或者转换为'int'。 – rgettman

+0

祝你好运Mateusz! 请将回答标记为已接受。 – amahfouz

5

当与byte s进行数学运算时,二进制数字提升发生,如JLS, Section 5.6.2所指定。

当操作者施加的二进制数值提升到一对操作数,其中的每一个必须表示一个值,该值可以转换为一个数字类型,适用下列规则,为了:

  1. 如果任何操作数都是引用类型,它将经历拆箱转换(§5.1.8)。

  2. 加宽原语转换(§5.1.2)被施加到转换的任一个或由下面的规则中指定的两个操作数:

    • 如果操作数的类型是双,另一种是转换为double 。

    • 否则,如果任一操作数的类型为float,则另一个操作数转换为float。

    • 否则,如果任一操作数的类型为long,则另一个操作数转换为long。

    • 否则,这两个操作数都转换为类型int

(重点煤矿)

,迫使你分配到一个类型,至少是一样宽int或转换回byte