类型转换


由于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
    */
    
    1. money在运算前符合int类型的存储范围,但在与years做运算后超出了int的取值范围,total会制成溢出。

    2. 同上,因为money和years是int类型的变量,其产生的结果会转成int类型的值,再转成long类型赋给total1,但再转成int值时已给发生了溢出

    3. 在做运算前,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

posted @   hello_12153_98  阅读(90)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!
点击右上角即可分享
微信分享提示