1.Java的8种基本数据类型及其所占空间大小:


boolean  8bit/1byte 
 
 
 

         byte      8bit/1byte 
 
 
 

         char      16bit/2byte 
 
 
 

         short     16bit/2byte 
 
 
 

     float      32bit/4byte 
 
 
 

         int        32bit/4byte 
 
 
 

         long      64bit/8byte 
 
 
 

         double  64bit/8byte

 


2.Java自动类型转换


     1)两种类型是彼此兼容的


目的类型占得空间范围一定要大于转化的 源类型


  正向过程:由低字节向高字节自动转换

    byte->short->int->long->float->double

  逆向过程:使用强制转换,可能丢失精度。

     int a=(int)3.14;

3. Java数据类型自动提升(注意以下讨论的是二元操作符)



    Java定义了若干使用于表达式的类型提升规则: 



   1) 所有的byte型. short型和char型将被提升到int型(例外: final修饰的short, char变量相加后不会被自动提升。)



   2)如果一个操作数是long形 计算结果就是long型;



   3)如果一个操作数是float型,计算结果就是float型;



   4)如果一个操作数是double型,计算结果就是double型;



 





  如果两个操作数其中有一个是double类型,另一个操作就会转换为double类型。



  否则,如果其中一个操作数是float类型,另一个将会转换为float类型。



  否则,如果其中一个操作数是long类型,另一个会转换为long类型。



  否则,两个操作数都转换为int类型。



 



    eg 1:



javafloat精度 java精度由高到低_操作数



1     Promote.java class promote 
 2     {  
 3         public static void main (string args[]) 
 4         { 
 5             byte b = 50;
 6             char c = 'a';
 7             short s = 1024; 
 8             int i = 50000; 
 9             float f =5.67f; 
10             double d =0.1234; 
11             double result = (f * b) + (i / c) - (d * s);        
12          } 
13      }



javafloat精度 java精度由高到低_操作数



     讲解:



      第一个表达式f * b中,b被提升为float类型,该子表达式的结果也提升为float类型。 



      第二个表达式i / c中,变量c被提升为int类型,该子表达式的结果提升为int类型。



      第三个表达式d * s中,变量s被提升为double类型,该子表达式的结果提升为double型。



      最后,这三个结果类型分别是float,int和double类型,想减后该表达式的最后的结果就是double类型。



    5) 黙认浮点类型为double,float数据类型有一个后缀为" f "或" F "。

    6) long类型有一个后缀,为" l " 或者" L "。

 eg 2:



javafloat精度 java精度由高到低_操作数



1   byte a = 1;
2 
3   byte b = 2;
4 
5   a = a+b;      //编译出错自动类型提升成int
6 
7   a += b;       //自加没有自动类型提升问题



javafloat精度 java精度由高到低_操作数



  把高字节转成低字节,需要作强制类型转换. byte c=(byte)a+b;

 

eg 3:



1 byte b1=1,b2=2,b3,b6; 
2 final byte b4=4,b5=6; 
3 b6=b4+b5; 
4 b3=(b1+b2);   //会发生编译错误
5 System.out.println(b3+b6);



  没有final修饰的变量相加后会被自动提升为int型,与目标类型byte不相容,需要强制转换(向下转型)。


4. Java强制类型转换


     格式:目标类型 变量=(目标类型)源类型变量/常量


eg: 

 

          int i=5; 

 

          byte j=(int)i;


注意:在强制类型转换中目标类型和源类型变量的类型始终没有发生改变


易错点:

byte b; 

 

          b=3; 

 

          b=(byte)b*3     
 //编译出错,因为(byte)的运算级别比*高,所以会先转换b后再*3 

 

          b=(byte)(b*3)   
 //正确