我已将数组 gx、数组 arr 定义为短类型。但为什么左边的操作可能会以int类型结束,而我必须将其转换为short?编译器错误可能是从 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.
}
是因为所谓的拆箱吗?这意味着我每次做手术都需要施放?
这不是拆箱,而是开箱。这是“二进制数字提升”。JLS 第 5.6.2 节 states:
当运算符将二进制数字提升应用于一对操作数时(每个操作数必须表示可转换为数字类型的值),将按顺序应用以下规则:
如果任何操作数是引用类型,则将对其进行拆箱转换(第 5.1.8 节)。
-
加宽原语转换(第 5.1.2 节)适用于按照以下规则指定转换一个或两个操作数:
如果其中一个操作数的类型为 double,则另一个将转换为 double。
否则,如果任一操作数的类型为 float,则另一个将转换为 float。
否则,如果任一操作数的类型为 long,则另一个将转换为 long。
否则,两个操作数都转换为 int 类型.
and
对某些运算符的操作数执行二进制数字提升:
乘法运算符 *、/ 和 %(第 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
例子。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)