欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Java类型转换(自动类型转换+强制类型转换)

程序员文章站 2022-03-24 17:23:44
...

一、 自动类型转换(隐式类型转换)

  • 整型、实型(常量)、字符型数据可以混合运算。运算中,不同类型的数据先转化为同一类型,然后进行运算。

自动转换从低级到高级。

Java类型转换(自动类型转换+强制类型转换)

自动转换有以下规律:

1、小的类型自动转化为大的类型
2、整数类型可以自动转化为浮点类型,可能会产生舍入误差
3、字符可以自动提升为整数

示例代码:
隐式类型转换

    int i = 128;
    double b = i;//128.0

Java类型转换(自动类型转换+强制类型转换)

整数类型可以自动转化为浮点类型,可能会产生舍入误差

  • Float和Double提供了快速的运算,然而问题在于转换为二进制的时候,有些数字不能完全转换,只能无限接近于原本的值
        float floatValue1=2+10f;
		float floatValue2=floatValue1-11.9f;
		System.out.println(floatValue2);//0.10000038

Java类型转换(自动类型转换+强制类型转换)
字符可以自动提升为整数

        char Value1 ='a';
		int Value2=Value1+10;
		System.out.println(Value2);//107

Java类型转换(自动类型转换+强制类型转换)

二、 强制类型转换(显式类型转换)

强制转换格式:(类型)变量名

  • 强制类型转换,在要强制类型转换的前面加上括号,然后在括号里面加上你要转换的类型

(强制转换需要程序员手动处理)
注意点:
1、强制类型转换可能导致溢出或损失精度
2、在把容量大的类型转换为容量小的类型时必须使用强制类型转换
3、浮点数到整数的转换是通过舍弃小数得到,而不是四舍五入
4、不能对布尔值进行转换
5、不能把对象类型转换为不相干的类型

示例代码:导致溢出(1)
容量大类型转容量小类型

  • 在把容量大的类型转换为容量小的类型时必须使用强制类型转换。
  • 溢出: 数据类型超过了计算机字长的界限而出现的数据溢出。
          int i = 128;
          byte b = (byte)i;//-128  内存溢出
        // 00000000 00000000 00000000 10000000 128的原码
		// 00000000 00000000 00000000 10000000 128的反码
		// 00000000 00000000 00000000 10000000 128的补码
		// 10000000 的补码
		// 11111111 反码
		// 10000000
        /**
		* 关于 原码,反码,补码的知识(了解)
		* 正数的反码,补码是其本身;
		* 负数的反码是符号位保持不变,其余位取反;负数的补码是在其反码的基础上+1
    	*/

1、为什么会是负的呢?
2、byte 最大值是 127,这里给了它128,所以它超出了最大值,数据类型超过了计算机字长的界限而出现的数据溢出
Java类型转换(自动类型转换+强制类型转换)
示例代码:导致溢出(2)

package com.gr.demo;
public class demo4 {
	public static void main(String[] args) {
		//操作比较大的数的时候,注意溢出问题
		//JDK7新特性,数字之间可以用下划线分割
		int money = 10_0000_0000;
		int years = 20;
		int tota1 = money*years;//-1474836480 计算的时候溢出了
		System.out.println(tota1);//-1474836480
		long tota2 = money*years;//默认是int,转换之前已经存在问题了?
		long tota13 = money*((long)years);//先把一个数转换为Long 在计算之前就把精度解决掉了
		System.out.println(tota13);//20000000000
	}
}

Java类型转换(自动类型转换+强制类型转换)
示例代码:损失精度

  • int是要强制类型转换后的数据类型
  • 浮点数转换整数是通过舍弃小数得到的,而不是四舍五入
System.out.println((int)23.7);//23 舍弃小数
System.out.println((int)-45.89f);//-45 舍弃小数

Java类型转换(自动类型转换+强制类型转换)

示例代码:字符强制转换成数字

char c1 = 'a';
		 char c2 = '中';
		 
		 System.out.println(c1);//a
		 System.out.println((int)c1);//97 强制转换
		 
		 System.out.println(c2);//中
	System.out.println((int)c2);//20013 强制转换
  • 注意:所有的字符本质还是数字
  • Char类型 会涉及到Unicode编码问题 上面的小写a就代表着97,大写的A代表着65。
    Java类型转换(自动类型转换+强制类型转换)
    ASCLL编码表片段,这个不是很详细,大家可以大概看看:
    Java类型转换(自动类型转换+强制类型转换)