类型中的意外行为

时间:2013-06-17 18:39:54

标签: java

我刚刚使用数据类型short创建了一个简单的java程序 该计划如下:

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 个答案:

答案 0 :(得分: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。

答案 1 :(得分:4)

来自the specification

  

如果移位运算符以外的整数运算符至少有一个   long类型的操作数,然后使用64位执行操作   精度,数值运算符的结果类型为long。   如果另一个操作数不长,则首先将其扩展(第5.1.5节)以进行输入   长期通过数字推广(§5.6)。

     

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

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

答案 2 :(得分:4)

因为两个short的乘法在java中返回int。要摆脱这个错误,你需要有明确的类型转换:

short x_square=(short)x*x;

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

short x_square = x; 
x_square *= x_square;

答案 3 :(得分:2)

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

相关问题