char和short都是双字节16bit长的数值类型,为什么相互赋值会提示精度丢失?

 问题内容:char和short都是双字节16bit长的数值类型,为什么相互赋值会提示精度丢失? http://community.csdn.net/expert/topicview1.asp?id=4466700 J2SE / 基础类     审核组:JAVA ztpia     解决者:steedhorse studyflex Java J2SE / 基础类

  • 原讨论链接:
  • 所属论坛:
  • 提问者:
  • 感谢:
  • 关键字:
  • 答案:

    在JAVA中.Short型在内存中是2个字节.char在内存中也是2个字节.为什么我转换的时候它还要提示精度可能丢失而要求我强制转换啊?
    short i =97;
    char c =i;
    也会提示精度丢失?
    请问这是为什么了?

    ---------------------------------------------------------------
    Java不像C和C++那样有许多标准未定义的东西,对基本的数据类型,Java对字长、符号、范围等都做了非常明确规定。
    在Java中,char是16bit长的无符号整数,因此范围是:0~65535,而short则是16bit长的带符号整数,范围是-32768~32767。
    所以,两者虽然字长相同,但意义却不一样(表示范围并不完全重合或包含),因此不管是char转换成short,还是short转换成char,都属于数值的“窄化转换”(Narrowing Primitive Conversion)。
    窄化转化都可能“丢失精度”,因此必须强制转换。
    虽然,这里的“丢失精度”跟从int到short的丢失精度给人的感觉似乎不一样,但仔细想想也没有什么区别,一方面,char有16个bit表示数值,而short用于表示数值大小的只有15个bit,因此,从char到short会“丢失数值精度”,而另一方面,short有1个bit表示数值的符号,而char却根本没有这么个符号位(所有的bit都用来表示数值大小了),所以从short到char也可能“丢失精度”,只是这里丢失的是有关正负的“精确程度”。

    关于“Widening Primitive Conversion”和“Narrowing Primitive Conversion”,可以查阅“The Java Language Specification”。


    谈一下个人意见:char和short之间的转换可以认为是不会丢失精度的,因为他们都是两个字节,存储容量一样,不过是作为两种不同的类型(也就是说只是表现形式不一样).两者表示数字的唯一区别:转为int时char作为无符号数,永远是正数,但是short是带符号的,符号扩展.但是那么的低16位是一致的.
    下面的代码可以证明经过两次转换是可以还原的,也就是没有丢失精度,
    不过是表现形式有点区别.
            char c;
            short s;
            for(int i=0;i<0xffff;i++){
                c=(char)i;
                s=(short)c;
                Assert.assertEquals(c,(char)s);        
            }
            for(int i=0;i<0xffff;i++){
                s=(short)i;
                c=(char)s;
                Assert.assertEquals(s,(short)c);        
            }

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值