java基础-06:数据类型转换

数据类型转换

转换关系:

  • 自动(隐式)类型转换
  • 强制(显式)类型转换

自动(隐式)类型转换

定义:数字表示范围小的数据类型可以自动转换成范围大的数据类型。

注意点:

  • byte、short、char 运算时直接提升为 int 。
  • boolean类型不能发生数据类型转换。
  • 整型数据类型默认是int类型。
  • 浮点型数据类型默认是double类型。
  • byte、short、char‐‐>int‐‐>long‐‐>float‐‐>double。

上图为敬:

注意:下图中实线表示自动转换时不会造成数据丢失,虚线则可能会出现数据丢失问题。

案例介绍

1、int类型和byte类型运算,结果是int类型,byte类型自动提升为int类型

int a = 1; 
byte b = 2; 
// byte x = a + b; // 报错,byte类型装不下int类型
int y = a + b;  //int+byte-->int+int-->int    
System.out.println(y);//3

2、int类型和double类型运算,结果是double类型,int类型会提升为double类型

int i = 1; 
double d = 2.5; 
//int e =d+i;  //报错,int类型装不下double类型
double e = d+i; //int+double-->double+double-->double
System.out.println(e); //3.5

3、左边是double类型,右边是float类型,左右不一样

double num = 2.5F;// float --> double,符合从小到大的规则,自动转换。
System.out.println(num); // 2.5

4、赋值时,右侧的数值大小不能超过左侧的类型范围,否则会有数据溢出问题

byte num4 = 40; // 注意!右侧的数值大小不能超过左侧的类型范围
byte num5 = 50;// byte + byte --> int + int --> int
int result1 = num4 + num5;
System.out.println(result1); // 90

5、浮点型之间的运算可能不太准确

float a = 1.1F; float b = 2.2F;
//int i = a + b; // 报错,int类型装不下double类型
float i = a+b;
System.out.println(i);//3.3000002

6、char运算时直接提升为int 。计算机的底层会用一个数字(二进制)来代表字符A,就是65。一旦char类型进行了数学运算,那么字符就会按照一定的规则翻译成为一个数字。

char c= 'A'; // 这是一个字符型变量,里面是大写字母A
System.out.println(c + 1); // 66,也就是大写字母A被当做65进行处理。char+int-->int+int-->int

数据溢出问题

例如:

int count = 100000000;
int price = 1999;
long totalPrice = count * price;

结果:编译没任何问题,但结果却输出的是负数。
原因:这是因为两个 int 相乘得到的结果是 int, 相乘的结果超出了 int 的代表范围。
解决:一般把第一个数据转换成范围大的数据类型再和其他的数据进行运算。

int count = 100000000;
int price = 1999;
long totalPrice = (long) count * price;

强制(显式)类型转换

定义:将取值范围大的类型强制转换成取值范围小的类型

格式:数据类型 变量名 = (数据类型)被转数据值;

注意事项:如果超出了被赋值的数据类型的取值范围得到的结果会与你期望的结果不同。

案例介绍

1、浮点转成整数,直接取消小数点,可能造成数据损失精度

//int a = 1.5; // 错误
int a = (int)1.5;//正确,不会四舍五入,小数点后面的数据直接舍去,a 的值变为1。//double-->int
System.out.println(a); //1

2、int 强制转成 short 砍掉2个字节;注意必须保证逻辑上真实大小本来就没有超过short范围,否则会发生数据溢出

int b =(int)2.3;//b的值为2
short c =1;
//c =b+c; //错误
c=(short)(b+c);//编译成功//int +short-->int+int-->short+short-->short
System.out.println(c); //3
byte num1 = 40;
short num2 = 60;
short result = (short) (num1 + num2);// byte + short --> int + int --> int
System.out.println(result); // 100

3、赋值时,右侧的数值大小不能超过左侧的类型范围,超出会报错,进行强转后不报错,但数据会溢出、丢失

byte num1 = (byte)4000; //数据超出byte范围
byte num2 = 50;
int result= num1 + num2;
System.out.println(result); // -46,数据出现异常

4、左边是int类型,右边是long类型,不一样,long --> int,不是从小到大,需强转为int类型

int num = (int)30L;
System.out.println(num);// 30
posted @ 2020-08-21 10:33  养乐多☀  阅读(267)  评论(0)    收藏  举报