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

解决方案 »

  1.   

    Java中应该只有低级到高级可以直接转换,平级的之间也不能直接转换,而需要强制转换。
      

  2.   

    基本类型加宽转换的19种情况
    byte   →  short, int, long, float, or double 
    short  → int, long, float, or double 
    char   → int, long, float, or double 
    int    → long, float, or double 
    long   → float or double 
    float  → double 
    double  X
        这里,从byte、short/char、int、long、float、double排列,向后基本上就是加宽转换。排除:byte→char 、short→char、char→short。加宽转换不会损失原数据的总体信息[有时精度会损失,
    如int/long→float、long→double时],不产生任何run-time异常。
      

  3.   

    byte→char 、short→char、char→short
    请问下为什么要排除这几种情况了。
    byte i =97;
    char c =i;
    提示精度丢失,应该是加宽,怎么会精度丢失了?能说明白点吗?谢谢原数据的总体信息 不代表精度?
      

  4.   

    to:
       studyflex(严)byte   →  short, int, long, float, or double 
    short  → int, long, float, or double 
    char   → int, long, float, or double 
    int    → long, float, or double 
    long   → float or double 
    float  → double 
    double  X??????
    int i=97;
    char c=i;
    一样会提示精度丢失?
    郁闷~资料查找中
      

  5.   

    我前面说得不准确,呵呵。刚刚查了查Java语言标准(The Java Language Specification 3.0),也明白了。
    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”。
      

  6.   


    byte  -128--127
    char  0--65535