从int到short的可能有损转换[重复]

Posted

技术标签:

【中文标题】从int到short的可能有损转换[重复]【英文标题】:possible lossy conversion from int to short [duplicate] 【发布时间】:2014-08-02 03:53:49 【问题描述】:

我已将数组 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.

是因为所谓的拆箱吗?所以这意味着我每次做手术都需要施法?

【问题讨论】:

int 大于 short。可能会发生位丢失。 编译器可能注意到您将short 值相乘并将结果存储到short 中。乘法的结果有可能大于short。这与装箱/拆箱无关。例如,这指的是从intInteger 的隐式转换。 试着把你的 2 换成短裤。 (短)2*arr... 谢谢!很多东西需要学习 【参考方案1】:

这不是拆箱;这是“二进制数字提升”。 Section 5.6.2 of the JLS 状态:

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

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

    加宽原语转换(第 5.1.2 节)适用于转换以下规则中指定的一个或两个操作数:

    如果任一操作数是 double 类型,则另一个将转换为 double。

    否则,如果任一操作数为浮点型,则将另一个转换为浮点型。

    否则,如果任一操作数为 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 示例中)进行操作时,都需要将其转换回。

【讨论】:

thnx,具体的,我明白了。

以上是关于从int到short的可能有损转换[重复]的主要内容,如果未能解决你的问题,请参考以下文章

将 int 转换为 ASCII 并返回 Python

C语言有没有个语句可以把short转换成char[]

如果在三元运算符中使用局部变量,为啥从 int 到 short 的缩小转换不起作用

如何打印short int C对象的字节表示[重复]

图像的基本有损压缩和无损压缩及解压

有关强制类型转换和自动类型转换