问题内容: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);
}