类型转换在运算当中是一个容易忽视的问题,此内容仅作日常记录
1、低-----》高,自动转换
2、高-----》低,强制转换
自动转换不多赘述,而由高到低的强制转换如果不注意可能会出现问题,通常操作都是在类型前加上:(强制转换类型)
例如:
double a=10.0 int b=(int)a;
如果不加(int),程序编译时会报错,这就是强制转换问题,到这里对java基本了解的都会明白。但在日常计算中,不仅存在高转低,同样存在低转高,而前文提到低转高是自动进行的,那么我们不需要注意了么?不是的,我们看一下以下例子:
int a=1000000000;//10亿 int b=10; int c=a*b; System.out.println(c);//1410065408 long d=a*b; System.out.println(d);//1410065408
此时,d=a*b是没有进行向上的自动转换的!
ps:此问题本质是内存溢出问题,了解内存溢出的人能一眼看懂原因,我尝试使用通俗释义解释。
解析:我们都知道int类型范围值是:-2147483648到+-2147483648【正负20亿之间】,那么无论是变量a亦或是变量b都未超出此范围,但运算结果c为100亿,超出此范围,所以未输出正确结果。
那么为何运算结果d仍会出现同样结果呢?此时我们要知道:java中“=”的含义,通俗说,是将=右侧的值赋予左侧,a*b运算时仍是int类型,也就是在赋值前就已经出现内存溢出问题,因此转换是不成功的!
解决:此类运算要在运算结果赋值前进行转换,d=a*((long)b),方可显示正确结果!
引申:1、有时运算过程需要手动转换(通常是向上转换),需注意;
2、清晰明了“=”的含义,与数学运算方式含义不同!



