从int到short的可能有损转换
我已将数组gx,数组arr定义为短类型。 但是为什么左边的操作可能会以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.
}
是因为所谓的unbox? 所以这意味着我每次进行手术都需要施放?
它不是拆箱; 这是“二进制数字促销”。 JLS第5.6.2节规定:
当运算符将二进制数字提升应用于一对操作数时,每个操作数必须表示可转换为数字类型的值,以下规则适用,顺序如下:
如果任何操作数是引用类型,则进行拆箱转换(第5.1.8节)。
应用扩展基元转换(第5.1.2节)来转换由以下规则指定的一个或两个操作数:
如果任一操作数的类型为double,则另一个操作数转换为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
原始数据类型操作时,都需要将其int
,例如在您的short
示例中。