强制类型转换和精度损失
一,类型转换
byte short int long 为整数型数据类型。它们的所占空间大小从小到大排序为:(byte<short<int<long)。
int与long为较常用的整数型,拿int为例子,它的规范格式为:
int i =10;//10这个整数型字面值是int类型; i变量声明时也是int类型; int类型10赋值给i。
在Java中“整数型字面值”被默认当作int类型来处理。如果要用long类型来处理的话,需要在“整数型字面值”后面添加 “L”。
例:
long i=10L;//int类型赋值给long有类型转化,小容量→大容量 自动类型转换机制。
但如果存储的数据超过该类型存储容量的最大值,那么就会报错。如:
int i=2147483648;
/*Exception in thread "main" java.lang.Error: Unresolved compilation problem:
The literal 2147483648 of type int is out of range (数值超过范围)*/
/*改正:*/
long z=2147483648L;
二,精度损失
例:
long x=100L;
int y=x;//编译错误
大容量→小容量(×)大容量到小容量要强制类型转换,要有相应的转化符,加上强制类型转化符后可通过编译,但会有精度损失,建议不要使用。
三,强制类型转化原理
每个类型所占的字节不同,强制类型转化的原理是砍了前面的字节,比如转化前是:
00000000 01100100
转化后:
01100100
如果大容量想要转向小容量,那么需要添加所转类型的前缀。例如:
long k=2147483648L;
int e=(int)k;**//注意,有问题**
上述代码编译虽然通过了,但是精度损失,输出的值为负数,上述涉及到原码、补码、反码,计算机采用的是补码形式存储,于是将补码转化成源码。
再举个byte的例子:
byte b=50;/*因为在范围内,sun公司允许这样写。50为int类型变量字面值; byte为byte类型变量; 大int→小byte无法通过*/
byte b=(byte)50;//可通过但会有精度损失,(byte)强制类型转化符
byte b=128;//编译出错,超出范围。