Java是一种强类型数据语言,这意味着必须为每一个变量都需要声明一种类型。Java主要有四类八种基本类型,包括4种整型、2种浮点型、1种字符类型和1种char字符类型。

       在使用基本数据类型时,我们注意到每种数据类型是有取值范围的,以整型为例:

类型

字节

取值范围

Byte

1

-128~+127

Short

2

-32768~+32767

Int

4

-2^31~+2^31-1

Long

8

-2^63~+2^63-1

        从上表中我们知道byte数据类型的取值范围时-128~127之间,那么如果使用超出取值范围的值对一个byte变量进行赋值会发生什么: 
        

byte b=129;
       System.out.println("b的值为"+b);

       事实上,该程序并不能编译执行,jvm会提示以下错误:      

Type mismatch:cannot convert from int to byte

       如果我们想强行将129赋给byte变量,就涉及到数值类型之间的转换。在Java中,有两种类型转换方式:自动类型转换和强制类型转换。

1.数值间的类型转换

       当使用两个不同类型的数值进行二元操作时(如f+i,f是浮点型,i是整型),先要将操作数转换成同一种类型之后,再进行运算。数值类型之间合法的转换遵循下图:

             

Java语言中以下类型转换错误的是 java中各种类型之间的转换_类型转换

 

       6条实心箭头表示无信息丢失的数值类型转换;3条虚线表示可能有信息丢失的类型转换。例如将整数123456789赋值给float类型时会丢失一定的精度。

int i=123456789;
   float f=i;// f的值位1.23456792E8

2.强制类型转转换

强制类型转换的语法格式是:(targetType)value,强制类型转换是通过截断来实现的:

  1. 当把一个浮点数强制转换成整数时,截断小数部分仅保留整数。
  2. 当把一个超出数据范围的数值付给数据类型时,例如把int类型的129转换成byte型整数时,值会变成-127。
float f=9.7f;
   int i=(int)f;//i的值为9
   byte b=(byte)385;//b的值为-127
   System.out.println(Integer.toBinaryString(385));//结果为110000001

      int型值为385的整数i的二进制补码为1 1000 0001,总共9位。在强制类型转换时,由于byte类型是一个字节(只能保存8位),所以变量b的二进制补码为1000 0001,对应补码的值为-127。

     此外,在对byte型、short型变量进行计算时会发生自动类型提升,将数值转换为int整形然后进行计算。

byte a=1;
byte b=2;
byte c=1+2;//正确,c=3
byte d=a+b;///报错:cannot convert from int to byte
byte e=(byte)(a+b);//正确 ,e=3

     因此,如果希望将计算结果保存在byte型、short型变量时需对结果进行强制类型转换。