5

我刚刚使用 datatype 创建了一个简单的 java 程序short
该程序如下所示:

class test
{
    public static void main(String arg[])
    {
        short x=1;
        short x_square=x*x;
    }
}

这个程序抛出一个错误:

java:6: possible loss of precision
found   : int
required: short

编译器是如何创建的int?该程序中没有int变量,所有变量都声明为short.

4

4 回答 4

11

int在算术运算期间,如果整数类型都不是类型,那么它们在 Java中总是被视为原始类型long。小整数类型被提升为,int运算结果为int. 因此x*x,类型转换为int,您尝试将其分配给short. short对于这种缩小转换,您需要显式转换为。

short x_square=(short)(x*x);

遵循JLS 4.2.2

如果除移位运算符之外的整数运算符至少有一个 long 类型的操作数,则使用 64 位精度执行运算,并且数值运算符的结果为 long 类型。如果另一个操作数不长,则首先将其扩展(第 5.1.5 节)以通过数字提升(第 5.6 节)键入 long。

否则,使用 32 位精度执行运算,数值运算符的结果为 int 类型。如果任一操作数不是 int,则首先通过数字提升将其扩展为 int 类型。

于 2013-06-17T18:40:50.190 回答
4

规范

如果除移位运算符之外的整数运算符至少有一个 long 类型的操作数,则使用 64 位精度执行运算,并且数值运算符的结果为 long 类型。如果另一个操作数不长,则首先将其扩展(第 5.1.5 节)以通过数字提升(第 5.6 节)键入 long。

否则,使用 32 位精度执行运算,数值运算符的结果为 int 类型。如果任一操作数不是 int,则首先通过数字提升将其扩展为 int 类型。

添加一个short 和一个short 会生成一个int。如果要将结果存储在 int 类型的变量中,则必须对其进行强制转换。

于 2013-06-17T18:41:35.503 回答
4

因为两个短裤的乘法int在java中返回一个。要消除此错误,您需要进行显式类型转换:

short x_square=(short)x*x;

或者,您还可以执行以下操作:

short x_square = x; 
x_square *= x_square;
于 2013-06-17T18:41:40.480 回答
2

尝试投射它:short x_square=(short)(x*x)

于 2013-06-17T18:41:37.850 回答