2015-05-11 89 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