2010-01-04 63 views
28
 //key & hash are both byte[] 
     int leftPos = 0, rightPos = 31; 
     while(leftPos < 16) { 
      //possible loss of precision. required: byte, found: int 
      key[leftPos] = hash[leftPos]^hash[rightPos]; 
      leftPos++; 
      rightPos--; 
     } 

爲什麼在Java中的兩個字節按位操作返回一個int?我知道我可以將它轉換回字節,但似乎很愚蠢。爲什麼兩個字節上的異或運算符產生一個int?

+0

僅供參考:http://java.sun .COM /文檔/書籍/ JLS/third_edition/html/conversions.html#5.6.2和http://java.sun.com/docs/books/jls/third_edition/html/expressions.html#5233。我不知道理由,所以我沒有發佈答案。 – 2010-01-04 23:22:54

+0

借調。我無法找到任何描述*爲什麼會發生上述情況的事情,只是它的確如此。 – 2010-01-04 23:24:47

+1

類型促銷存在以下幾個原因。對於按位運算來說,它幾乎比其他所有其他運算都少,但是 - 爲什麼不呢?你總是可以把它扔回去。 – 2010-01-04 23:27:26

回答

20

因爲語言規範是這樣說的。它沒有給出理由,但我懷疑這是最有可能的意圖:

  • 爲了有一個小而簡單的規則,以涵蓋涉及的類型
  • 所有可能的組合算術運算允許有效的實現 - 32位整數是CPU在內部使用的內容,其他所有內容都需要轉換,顯式或隱式。
+3

使用本機32位CPU操作是最可能的原因。 – mletterle 2010-01-04 23:47:59

2

在兩個字節上沒有Java按位操作。您的代碼會隱式地將這些字節默認轉換爲較大的整數類型(int),並且結果也是這種類型。

您現在可能會質疑在未定義的字節上保留按位運算的完整性。

+0

同樣,問題是*爲什麼會發生這種情況。 – 2010-01-04 23:25:04

+2

這就是爲什麼發生這種情況的原因,我認爲你在尋找的問題是「爲什麼他們決定讓字節類型未定義的位運算符需要隱式轉換爲int?」 – mletterle 2010-01-04 23:29:17

+3

這些操作是* not * undefined;實際上它們的定義很清楚。只是結果是int,如果沒有明確的轉換,就不能存儲在byte []中。 – 2010-01-04 23:36:19

4

如果這是正確的,有沒有價值,可能會導致精確度這一損失換句話說:「不可能損失精度」編譯器應該閉嘴......並且需要糾正,並且不應該在此添加劇組:

byte a = (byte) 0xDE; 
byte b = (byte) 0xAD; 
byte r = (byte) (a^b); 
相關問題