当前位置: 首页 > 面试题库 >

从int到short可能的有损转换

常英毅
2023-03-14
问题内容

我已经定义了数组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节规定:

当运算符将二进制数字提升应用于一对操作数时,每个操作数必须表示一个可转换为数字类型的值,以下规则适用:

  1. 如果任何操作数是引用类型,则将其进行拆箱转换(第5.1.8节)。

  2. 扩展原语转换(第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(例如在short示例中),您都需要将其回退。



 类似资料:
  • 我试图用java将十六进制数据写入我的串口,但是现在我不能将十六进制数据转换成字节数组。 以下是显示错误消息的代码: 这是写入串行端口的代码: 我能知道如何解决这个问题吗?目前我正在使用javax.comm插件。谢谢。

  • 所以我最近写了以下代码: 当我尝试使用cmd运行它时,它一直显示以下内容: 有人能帮我解释一下我犯的错误吗?

  • 问题内容: 所以我最近写了下面的代码: 但是,它一直显示: 当我尝试使用cmd运行它时。 有人可以帮助并解释我所犯的错误吗?任何帮助表示赞赏:)。谢谢! 问题答案: 当您转换到,值的精度损失。例如,当您将4.8657(double)转换为int时,int值将为4.Primitive 不存储十进制数字,因此您将丢失0.8657。 在您的情况下,0.7是一个双精度值(除非提到float-0.7f,否则

  • 我希望输入一个和另一个ex: 1和1000000000,现在我希望创建一个大小为1000000000的数组。然后在数组的每个索引处,存储int val,ex:。 当我尝试执行此操作时,Netbeans 会向我显示此行中的错误: “可能从long到int的有损转换”。这是我的密码:-

  • 我试图在Textpad中复制这个Java程序,但我收到以下错误 C:\Users\User\Desktop\java\Drawing.java:14: 错误: 不兼容的类型: 从 float 到 int g.drawLine ((getWidth()/2) , 0, (getWidth()*i) , (getHeight()/2)); 这是代码 在getWidth*i之前我已经尝试过添加(floa