java 不支持 不同类型的数据进行运算的。
如果不同类型的数据进行运算的时候,第一步要将不同的数据类型转换为同一种类型之后,然后再做运算。这种转换是编译器来完成的。称之为:自动向上(向范围大的类型)类型转换。
因为是安全的,所以是自动的。
自动转换的规则:
1:如果多个操作数的类型为下述类型:byte,char,short int,,那么这些操作数,都将被自动转换为int类型之后,再做运算,返回值为int。
2:如果多个操作数的类型中,表示范围最大的类型为long 类型。那么这些操作数,,都将被自动转换为long类型之后,再做运算,返回值为long。
3:如果多个操作书中,表示范围最大的类型为float类型,那么所有的操作数都被转换为 float 类型之后,再做运算。返回值为float。
4:如果多个操作书中,表示范围最大的类型为double类型,那么所有的操作数都被转换为 double类型之后,再做运算。返回值为double。
注意:有三种自动类型转换是可能存在精度的损失的。但是java 允许这种自动转换中的精度的损失。
int–>float
long–>float
long—>double
因为float 和 double类型有效数字的位数的限制,导致不能精确的表示 int 和 long 的数据。
赋值时候的类型转换
基本的规则:
左边的变量的类型表示的范围只要大于等于右边的表达式的返回值的类型的范围,就可以进行赋值。
左边的类型 要大于等于右边表达式的返回值的类型。
强制类型转换
需要的环境:
有些时候,有将一个大类型的数据,赋值给一个小类型的变量。
java 提供了一种语法来实现这个功能。 将一个大类型强制转换为一个小类型:强制向下类型转换。不一定是安全的。
语法:(强制转换的类型) 被转换的数据
注意:如果 被转换的数据是一个表达式,需要将表达式括起来。将表达式的返回值强制转换为要转换的类型。
强制转换数据 数据被截断的规则:
1:整数:只保留低位部分。高位被截断。
举个栗子:int 强制转换为byte ,那么int 的高24bits 数据直接被截断了,只保留低8bits 作为byte 的数据。
2:浮点数,强制转换为 整数:小数部分直接砍掉。整数部分截断同上。
int 类型 127的二进制:111 1111
byte 类型中 -128 二进制形式:1000 0000
int 类型中 255 的二进制形式:1111 1111
类型自动转换图
字符串连接时的转换
字符串进行 + 连接的时候,也会进行类型的自动转换。
本质是字符串只能和字符串连接。
字符串可以和任意类型做连接是如何实现的呢?
编译器会将其他的任意的类型,都转换为 字符串之后,才和其他的字符串做连接。
还记得之前几篇文章写的啥吗,来复习一下:
1:java 最大的特点,就跨平台。 跨平台的核心实现 jvm。
2:java 支持的数据类型。
8种基本数据类型。+String。
3种引用数据类型。
3:定义变量。使用变量来访问数据的。
4:常量。字面+final 修饰的。
字面常量的类型。
12:int
12L:long
1.2:double
1.2f:float
true,false:boolean
‘A’:char
“12323”:String
5:java类型转换:
自动向上:向范围更大的类型。
强制向下:向小范围类型。