精度丢失问题"/>
JAVA Char类型强制转换情况int、long转float、double的精度丢失问题
By Mejias
-
一、Char类型和强制转换为short byte类型
-
超出short类型存储范围的char值转换为short
Eg;举一个char值为'\uf800';这个值为63488。
用两个无符号的byte存储空间表示为:1110 1110 0000 0000
转换为short类型,有符号的2byte存储:1110 1110 0000 0000
Short类型下表示的值为:= -(32768*2-63488)=-2048
由以上可知,超出short存储范围的char转换为short为有符号存储,成为负数。
2.超出byte类型存储范围的char值转换为byte
A:当char的取值范围为>=128 && <256时:
Eg:举一个CHAR值为’\u0080’:实际数为128
此范围内可用一个无符号Byte空间存储,该例子存储为:1000 0000
转换为Byte类型,有符号的1Byte存储,1000 0000
Byte类型下实际表示的数为:-128
B:当char的取值范围为 >=256时:
Eg1:举一个char值为'\u0100':实际数为256
此范围用无符号二进制表示为:1 0000 0000
用byte类型存储时溢出,剩余后8位存储成功,为:0000 0000
Byte类型下实际表示的数为:0
Eg2:举一个char值为'\uf807':实际数为63495
此范围用无符号二进制表示为:1110 1110 0000 0111
用byte类型存储时溢出,剩余后8位存储成功,为:0000 0111
Byte类型下实际表示的数为:7
由上可知,char的取值范围为>=128&&<256时,强制转换为Byte类型成为负数;
Char的取值范围为 >=256时,强制转换为Byte类型将溢出。
-
二、Int、long类型转换为float或者double类型的探讨
1.int类型转换为float类型进度丢失的问题
单精度浮点型
IEEE754标准中,float用四个字节表示,即为32位
符号位(S) | 阶码(E) | 尾数(M) |
1 | 8 | 23 |
当尾数M有效位全为1时,即为 1111 1111 1111 1111 1111 111
实际表示地小数为 1.1111 1111 1111 1111 1111 1111 1111 111
当这个数表示一个正整数时:
则1.1111 1111 1111 1111 1111 111*2^23//小数点移23位
E的阶码表示的数为 127 + 23 = 150,无符号8位二进制数表示为:1001 01100
整个浮点数的二进制的表示为:
1100 1011 0111 1111 1111 1111 1111 1111
此时这个数表示的是16777215.0
A:当int类型的值>16777215时
Eg1: 16777218
二进制表示为:1 0000 0000 0000 0000 0000 0010
转换为浮点法表示为: 1. 0000 0000 0000 0000 0000 001 * 2^24
Eg2:16777219
二进制表示为:1 0000 0000 0000 0000 0000 0011
转换为浮点法表示为: 1. 0000 0000 0000 0000 0000 001 * 2^24(超出23位的部分被舍弃)
B:当int类型的值<=16777215时
由于用23位有效位可表示所有的数,因此不会出现精确值不准的问题。
Eg:16777213
由上可知大于16777215的int数转换为float数,会出现精确值不准的问题;
小于等于16777215的int数转换为float数,不会出现精确值不准的问题。
2.long类型转换为double类型精度丢失的问题
同上论述可证明,double类型的值(有效位52为.位),
大于9,007,199,254,740,991的Long数转换为double数,会出现精确值不准的问题;
小于等于9,007,199,254,740,991的Long数转换为double数,不会出现精确值不准的问题。
更多推荐
JAVA Char类型强制转换情况int、long转float、double的精度丢失问题
发布评论