类型转换
由于java是强类型语言,在对做运算时需要将不同类型的数据先转化为同一类型,然后再运算
整型、常量、字符型数据可以混合运算
类型转换有前提
-
不能对boolean类型进行类型转换。
-
不能把对象类型转换成不相关类的对象。
-
在把容量大的类型转换为容量小的类型时必须使用强制类型转换(这样会丢失精准度)。
-
转换过程中可能导致溢出或损失精度
int i = 128; byte b = (byte) i;//-128
由于byte是8bit,最大值是127,在int强转为byte时,值就有可能会导致溢出
从浮点数转换到整数是通过舍弃小数得到的,而不是四舍五入
转换从低级到高级
低 ------------------------------------> 高
byte,short,char—> int —> long—> float —> double
1. 自动类型转换
容量小的类型可以自动转换为容易大的类型
char c = 'a';
int i = c;
System.out.println(i);//97
i = c + 1;
System.out.println(i);//98
通过查询ACIIS码表得知字符a,对应的int值为97,所以i = 97,而i = c + 1 = 97 + 1 = 98
2. 强制类型转换
强制类型转换是显式的转换一个数值的类型,一般用于高容量的类型转换为低容易的类型。
在有可能丢失信息的情况下进行的转换是通过强转来完成的,但可能造成精度降低或溢出。
格式:(type)var
,运算符 “()” 中的 type 表示将值var想要转换成的目标数据类型。 条件是转换的数据类型必须是兼容的
double d = 3.14;
int id = (int) d;
char c = 'a';
int cd = c + 1;
System.out.println(id);//3
System.out.println((char)cd);//b
当将一种类型强制转换成另一种类型,而又超出了目标类型的表示范围,就会被截断成为一个完全不同的值
int num = 8421;
byte num_byte = (byte) num;//-27
System.out.println(num_byte);
3. 错误和问题
-
做运算时,留意数据的溢出
int money = 200000000; int years = 20; int total = money * years; long total1 = money * years; long total2 = money * ((long) years); /* total = -294967296 tosal1 = -294967296 total2 = 4000000000 Process finished with exit code 0 */
-
money在运算前符合int类型的存储范围,但在与years做运算后超出了int的取值范围,total会制成溢出。
-
同上,因为money和years是int类型的变量,其产生的结果会转成int类型的值,再转成long类型赋给total1,但再转成int值时已给发生了溢出
-
在做运算前,years已经转换为long类型,所以表达达个提升容量,全部变量以long来计算
-
4.JDK7
JDK7新特性: 二进制整数
在开发中会经常使用二进制整数,格式以0b开头,因为是两进制所以0b后面的数值以0、1组成,例0b01001、0b01110
int a = 0b0011;//3
JDK7新特性:下划线分隔符
在实际开发和学习中,如果遇到特别长的数字,可以用下划线分隔符进行分割,但下划线不会进输出,方便了阅读
int a = 1_2345_5678;
System.out.println(a);//12345678
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!