在定义变量时,有许多要注意的问题,1不谨慎就会出现损失精度或不兼容类型等问题。
例如:
1.定义长整型数据时,必须加后缀l或L
long l =123456789012345L
2.定义单精度类型时(7⑻位有效数字),必须加后缀 f 或 F
float f = 12.5F
3. boolean类型不可以转换为其它的数据类型。
这其中,我们常常会遇到数据类型的转换问题,最为常见的要属隐式转换和强迫转换了,我们来分析1下。
隐式转换
特点:
从小到大,可以隐式转换,数据类型将自动提升。
byte,short,char -->int -->long -->float -->double
注意:long是8个字节,float是4个字节。
long是整数,float是浮点型,整数和浮点数的存储规则不1样,记住1点long的范围是小于float的。
例 :
byte a=10;
int b=a;
当编译intb=a 时, a隐式转换为int类型。
强迫转换
特点:
从大到小(如果你明确知道数据是可以用该数据类型来表示的,可以用强迫转换)
格式:(转换后的数据类型)变量或值。
注:1般情况下,根本不推荐使用强迫类型转换。
例1 :
int a=10;
byte b=(byte)a;
当编译 byte b=(byte)a 时, a被强迫转换为byte类型。
例2:
解析:
数据130默许的是int类型的10进制数据,
第1步:10进制130转换成2进制数据。
10000010
第2步:130在内存中的表示情势以下
原码:0000000000000000 00000000 10000010
第3步:求int130的补码
由于130是正数,所以,反码和补码都和原码1致。
补码:0000000000000000 00000000 10000010
第4步:对补码进行截取,只剩下最后8位。
(byte)130 的补码为:10000010
第5步:把该补码转化为原码。
由于符号位(第1位)是1,故该数为负数,
反码:10000001 (补码⑴)
原码:11111110 (符号位不变,数据位取反)
转化为10进制为 ⑴26 ,所以终究打印⑴26。
例3 :
shorts = 1;
s= s +1;
和
shorts = 1;
s+=1;
有问题吗?为何呢?
解析:
第1程序会报错:毛病:不兼容的类型:从int转换到short可能会有损失
缘由:s=s+1;s+1会隐式转换为int类型,当把1个int类型赋值给short类型是,可能会损失。
第2个程序可以编译运行。
缘由:s+=1,虽然可以看作s=s+1,但是还是有区分的,s+=1中有1个强迫转换,即s=(short)(s+1), 会把s+1的值强迫转换为short类型,故不会报错。
小结:
数据类型转换的问题如果产生在 1些小程序上,我们 也许能够1眼看出,可是当编写1个庞大的系统时,具有庞大数据量时,这些小小的问题可能致使系统出错乃至崩溃,所之前期代码编写的严谨性就得靠我们自己掌控了。
上一篇 大数幂取模