2014-06-11 25 views
3

我已經定義了數組gx,數組arr是short類型。但爲什麼左邊的操作可能以int類型結束,我必須簡化它?編譯器錯誤是可能的有損轉換從int到短。從int到short的可能有損轉換

這是我的代碼。

public PixImage sobelEdges() { 

short gy=0; 
for(int x=1;x<width-1;x++){ 
    for(int y=1;y<height-1;y++){ 
     // if(x=){ 
      for(int z=0;z<3;z++){ 
      gx[x][y][z]=arr[x-1][y-1][z]-arr[x+1][y-1][z]+2*arr[x-1][y][z]-2*arr[x+1][y][z]+arr[x-1][y+1][z]-arr[x+1][y+1][z]; 

      } 
     // }  
    }  
} 
return this; 
// Don't forget to use the method mag2gray() above to convert energies to 
// pixel intensities. 

}

是不是因爲所謂的拆箱?這意味着每次我進行手術時都需要施放?

+0

'int'大於'short'。可能會丟失位。 –

+0

編譯器可能注意到您將「short」值相乘並將結果存儲爲「short」。乘法的結果有可能比「short」更大。這與拳擊/取消裝箱無關。例如,這指的是從'int'到'Integer'的隱式轉換。 – bstar55

+1

試着將你的2做短褲。 (短)2 * arr ... – bstar55

回答

7

這不是拆箱;這是「二進制數字提升」。 Section 5.6.2 of the JLS狀態:

當操作者施加的二進制數值提升到一對操作數,其中的每一個必須表示一個值,該值可以轉換爲一個數字類型,適用下列規則,爲了:

  1. 如果任何操作數是引用類型,它將會經歷拆箱轉換(§5.1.8)。

  2. 加寬原語轉換(§5.1.2)被施加到轉換的任一個或由下面的規則中指定的兩個操作數:

    • 如果操作數的類型是雙,另一種是轉換爲double 。

    • 否則,如果任一操作數的類型爲float,則另一個操作數轉換爲float。

    • 否則,如果任一操作數的類型爲long,則另一個操作數轉換爲long。

    • 否則,兩個操作數都轉換爲類型int

二元數值提升是在某些運營商的操作數執行的:

  • 乘法運算符*,/,和%(§15.17 )

  • 個加法和減法運算符用於數字類型+和 - (§15.18.2)

  • 數值比較運算符<,< =,>,和> =(§15.20.1)

  • 數值相等運算符==和!=(§15.21.1)

  • 整型位運算符&,^和| (§15.22.1)

  • 在某些情況下,條件運算符? :(§15。25)

(重點煤礦)

當這些值相加/相乘,它們在數學完成之前晉升爲int。最後,您可以轉回到short,然後再分配回陣列。

gx[x][y][z] = (short) (arr[x-1][y-1][z]-arr[x+1][y-1][z]+2*arr[x-1][y][z] 
    -2*arr[x+1][y][z]+arr[x-1][y+1][z]-arr[x+1][y+1][z]); 

您需要在每次使用了比int較小的原始數據類型,如您short例如運行時間將它轉換回。

+0

thnx,具體來說,我明白了。 –

相關問題