2014-06-11 24 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,具体来说,我明白了。 –

相关问题