类型转换分为自动转换和强制转换。
自动转换一般是类型存储位数低的转向类型存储位数高的,
byte(1字节)->short(2)->char(2)->int(4)->long(8)->float(4)->double(8),前面的可以自动转换到后面的,自动类型转换一般不会导致数据丢失。因为存储位数低的类型对象只需在其二进制码前补上相应的0即可转换成存储位数高的类型,不会导致数据丢失。强制转换恰好相反,存储位数高的类型对象要截断高位二进制码才能转换成存储位数低的类型,截断将导致数据丢失。
short char之间的转换
short和char的区别就是short是有符号位整数,取值范围为-32768~32767,char是无符号位的,取值范围为0~65535。由于最高位二进制码代表的意义不同,所以无论是从short到char又或者从char到short都有可能发生丢失精度。
浮点 整数之间的转换
float的类型存储形式:符号位1位,指数8位,尾数(小数部分)23位。由于科学计数法,化为二进制的整数部分必为1,所以不需记录整数部分。
例子:
123456789 二进制 111010110111100110100010101 科学计数法表示就是1.11010110111100110100010101*2^26。正数,符号位0,指数26,为00011010,尾数11010110111100110100010101,但尾数位只有23位,截断,精度丢失,所以为11010110111100110100011(第23位为0,24位为1,0舍1入,所以23位为1)。最后变成1.11010110111100110100011*2^26
打印结果:
1.23456792E8(精度已丢失)
用计算器将十进制的123456792转换成二进制得111010110111100110100011000
正是上述的1.11010110111100110100011*2^26,所以整形转浮点型有可能出现精度丢失。
最后还是没能理解ieee754标准,搞不清楚float在内存中是怎么存的。求大神告知。
自动转换一般是类型存储位数低的转向类型存储位数高的,
byte(1字节)->short(2)->char(2)->int(4)->long(8)->float(4)->double(8),前面的可以自动转换到后面的,自动类型转换一般不会导致数据丢失。因为存储位数低的类型对象只需在其二进制码前补上相应的0即可转换成存储位数高的类型,不会导致数据丢失。强制转换恰好相反,存储位数高的类型对象要截断高位二进制码才能转换成存储位数低的类型,截断将导致数据丢失。
short char之间的转换
short和char的区别就是short是有符号位整数,取值范围为-32768~32767,char是无符号位的,取值范围为0~65535。由于最高位二进制码代表的意义不同,所以无论是从short到char又或者从char到short都有可能发生丢失精度。
浮点 整数之间的转换
float的类型存储形式:符号位1位,指数8位,尾数(小数部分)23位。由于科学计数法,化为二进制的整数部分必为1,所以不需记录整数部分。
例子:
123456789 二进制 111010110111100110100010101 科学计数法表示就是1.11010110111100110100010101*2^26。正数,符号位0,指数26,为00011010,尾数11010110111100110100010101,但尾数位只有23位,截断,精度丢失,所以为11010110111100110100011(第23位为0,24位为1,0舍1入,所以23位为1)。最后变成1.11010110111100110100011*2^26
int i = 123456789;
float f1 = i;
System.out.println(f1);//打印转型后的float
打印结果:
1.23456792E8(精度已丢失)
用计算器将十进制的123456792转换成二进制得111010110111100110100011000
正是上述的1.11010110111100110100011*2^26,所以整形转浮点型有可能出现精度丢失。
最后还是没能理解ieee754标准,搞不清楚float在内存中是怎么存的。求大神告知。