我刚刚使用数据类型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
。
答案 0 :(得分:11)
在算术运算期间,如果它们都不是int
类型,则整数类型在Java中始终被视为long
原语。小整数类型被提升为int
,操作结果为int
。因此,x*x
类型为int
,您尝试将其分配给short
。您需要明确转换为short
以进行此缩小转换。
short x_square=(short)(x*x);
如果移位运算符以外的整数运算符至少有一个long类型的操作数,则使用64位精度执行运算,并且数值运算符的结果为long类型。如果另一个操作数不长,则首先将其扩展(第5.1.5节)以通过数字提升(第5.6节)键入long。
否则,操作使用32位精度执行,数值运算符的结果为int类型。如果任一操作数不是int,则首先将其扩展为通过数字提升键入int。
答案 1 :(得分:4)
如果移位运算符以外的整数运算符至少有一个 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)