public class AutoPromote
{
public static void main(String[] args)
{
short sValue=5;
sValue=sValue-2;
}
}为什么可以直接将int类型的值直接赋给short类型的变量,而不能计算后得到的int类型的值赋给short类型呢??希望高人指点。
{
public static void main(String[] args)
{
short sValue=5;
sValue=sValue-2;
}
}为什么可以直接将int类型的值直接赋给short类型的变量,而不能计算后得到的int类型的值赋给short类型呢??希望高人指点。
{
public static void main(String[] args)
{
short sValue=5;
sValue=(short)(sValue-2);
}
}
a++;
a=a+1;
a+=1;
他们是不同的,主要是数据类型的自动转换问题以及精度的丢失!
// 赋值给比int大的类型,只要数值在int内 也不用在后边加 L D 之类的 如
//long i = 1231245635; double d = 3143542; float f = 3146524;
sValue=sValue-2; // 这里右边运算时候 2 默认是int的 故 sValue 也转成int计算后结果是 int的 赋值给short得强转
sValue=sValue-2;这是将int类型的数字赋给short类型相当于强制将int类型转换成short类型在java中只支持将小类型转换成大类型而不支持将大类型转换成小类型因为大转小会出现数据丢失的。
2是int类型故转换为short是要强制转换
public class AutoPromote
{
public static void main(String[] args)
{
short sValue=5;//正确的,int类型可以直接赋给short,byte,char类型
sValue=sValue-2;//错误的,右边计算的结果是int类型,为什么不能赋给short变量呢??
}
}
因为short精度比int的小。位数比int少,所以大的不能向小的里面去转,除非强转,小的可以直接向大的转换
而sValue是short型的所以报错
当sValue=sValue-2运算的时候,把2当成int型来运算,自动转换成大的类型也就是结果是int的了,此时再赋值给sValue就会出错了。不知道是不是这样?
import java.lang.*;
import java.io.*;public class Test1
{
public static void main(String[] args)
{
short sValue=5;
sValue=(short)(sValue-2);
}
}
int占32个坑;
从编译的角度来讲,你用short存放一个能用16个坑装下的东西,编译器能够自动判断信息是否损失;
+-*/四则运算的两个因数必须至少是32个坑,比它短的short类型参与计算的时候自动升级,这个过程不会有信息损失所以能够直接通过编译,但是最终至少结果是int;
从编译器设计来说,把一个32个坑的东西,自动抛弃一部分放到比较小的容器内是很容易的事情,但是编译器希望开发人员对这一信息的损失进行确认,以避免失误,这就是为什么必须加强制类型转换!
另类的理解,可以参考下!
short short2 = 32767; //short类型最大值
//在最小最大之间的都不会出现报错,因为编译器编译期间就已经知道他的确切值了。
//short1 = short1 + 1; 此时右值已经自动转换成int类型,他的值范围远远大于short的-32768~32767,所以会报错
a=a+5;//错误,如你所说
byte b=5;
b+=5;//正确,可是他不是相当于b=b+5;吗