JAVA Char类型强制转换情况&int、long转float、double的精度丢失问题

By Mejias

  • 一、Char类型和强制转换为short  byte类型

  1. 超出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数,不会出现精确值不准的问题。

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java中提供了以下方法可以进行类型之间的转换: 1. 将基本数据类型转换为字符串: ```java byte b = 1; String strByte = Byte.toString(b); // byte 转换为字符串 short s = 2; String strShort = Short.toString(s); // short 转换为字符串 int i = 3; String strInt = Integer.toString(i); // int 转换为字符串 long l = 4L; String strLong = Long.toString(l); // long 转换为字符串 float f = 5.0f; String strFloat = Float.toString(f); // float 转换为字符串 double d = 6.0; String strDouble = Double.toString(d); // double 转换为字符串 char c = 'a'; String strChar = Character.toString(c); // char 转换为字符串 boolean bool = true; String strBool = Boolean.toString(bool); // boolean 转换为字符串 ``` 2. 将字符串转换为基本数据类型: ```java String str = "123"; byte b = Byte.parseByte(str); // 字符串转换为 byte short s = Short.parseShort(str); // 字符串转换为 short int i = Integer.parseInt(str); // 字符串转换为 int long l = Long.parseLong(str); // 字符串转换long float f = Float.parseFloat(str); // 字符串转换float double d = Double.parseDouble(str); // 字符串转换double char c = str.charAt(0); // 字符串转换char boolean bool = Boolean.parseBoolean(str); // 字符串转换为 boolean ``` 需要注意的是,在进行字符串转换成基本数据类型的时候,如果字符串的格式不符合相应数据类型的规范,会抛出NumberFormatException异常。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值