栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

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

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

  • 转载请注明:文章转载自 www.mshxw.com
    本文地址:https://www.mshxw.com/it/781560.html
    我们一直用心在做
    关于我们 文章归档 网站地图 联系我们

    版权所有 (c)2021-2022 MSHXW.COM

    ICP备案号:晋ICP备2021003244-6号