JAVA数据类型转换

4 篇文章 0 订阅

JAVA在数据类型之间的运算时会进行数据类型的转换,对初学者来说不了解数据类型转换在运行JAVA程序

时可能会被报错。

一般来说我们在运算时,要求参与运算的数据保持一致,当数据不一致时就会进行数据类型转换

1.下面说下JAVA数据类型

(1)Java是一种强类型语言,针对每种数据都提供了对应的数据类型。


(2)分类:
        A:基本数据类型:4类8种
        B:引用数据类型:类,接口,数组。

 (3)基本数据类型
        A:整数            占用字节数
            byte                  1
            short                 2
            int                      4
            long                  8
        B:浮点数
            float                   4
            double              8
        C:字符
            char                   2
        D:布尔
            boolean            1
            
        注意:
            整数默认是int类型,浮点数默认是double。
            
            长整数要加L或者l。
            单精度的浮点数要加F或者f。


2.再来说下数据类型转换规则

(1)boolean类型不参与转换

(2)默认转换
        A:从小到大
        B:byte,short,char -- int -- long -- float -- double
        C:byte,short,char之间不相互转换,直接转成int类型参与运算。
(3)强制转换
        A:从大到小
        B:可能会有精度的损失,一般不建议这样使用。
        C:格式:
                      目标数据类型 变量名 = (目标数据类型) (被转换的数据);

3.看下具体的操作例子

class DataTypeText
{
	public static void main(String[] args)
	{
		byte b1 = 3;
	    byte b2 = 4;
	    byte b3 = b1 + b2;//属于类型提升,会报错
		byte b4 = 3 + 4;//常量,不会报错
		System.out.println(b3);
		System.out.println(b4);
		}
}

byte b3 = b1 + b2 编译失败,为什么呢?

而byte b4 = 3 + 4为什么又是被成功编译了呢?

两个变量相加,先对类型进行提升,然后运算,再将运算结果赋值。

b1与b2由byte型提升为了int型,又将int型赋予byte型的b3会造成精度丢失而报错

两个常量相加,先计算常量数值,然后判断是否满足类型范围,再赋值。

对于常量会先将结果算出,看是否在类型范围内,再赋值,byte的范围为-128~127,对于7在该范围内不会报错

class DataTypeDemo3 {
	public static void main(String[] args) {
		
		//定义一个byte类型,一个int类型,做加法
		byte a = 3;
		int b = 4;
		System.out.println(a + b);
		
		//可能损失精度
		//byte c =  a + b;
		int c = a + b;
		System.out.println(c);
	}
}

默认转换(从小到大的转换)
        A:byte,short,char—int—long—float—double
        B:byte,short,char相互之间不转换,他们参与运算首先转换为int类型

首先看下面的间接输出 byte c = a + b 时为什么会报错,当int型的数据与byte型数据相加时首先byte型数据会被自动提升为int数据

然后两个int型数据相加的结果你放在byte型的变量中可能会造成放不下而造成精度损失(一个大碗与小碗中的东西相加,首先将小碗换成大碗,然后你要将两个大碗中的东西相加放在一个小碗中就会造成损失),如果你不想让它报错就要进行强制类型转换

将byte  c = a + b 改为 byte  c = (byte) (a + b),将大碗强制转换为小碗

强制转换
        A:从大到小
        B:可能会有精度的损失,一般不建议这样使用。
        C:格式:
                      目标数据类型 变量名 = (目标数据类型) (被转换的数据);

来看下上面直接println(a + b)并不会报错因为你直接将结果输出了并没有将这个结果赋值于谁

class DataTypeDemo5 {
	public static void main(String[] args) {
		double d = 12.345;
		float f = (float)d;
		
		float f1 = (float)12.345;
		float f2 = 12.345F;
	}
}

思考题1:请问下面这个有没有问题
        double d = 12.345;
        float f = d;

有问题会报错,将double型赋值于float型会造成精度丢失

改进强制类型转换 改为 float f = (float) d

思考题2:看看下面两个定义有没有区别呢?
        float f1 = (float)12.345;
        float f2 = 12.345f;
        
       上面的 f1其实是通过一个double类型转换过来的。(整数默认为int,浮点数默认为double)
        而f2本身就是一个float类型。

 

思考题3:byte b = 130;有没有问题?如果我想让赋值正确,可以怎么做?结果是多少呢?
    
    练习:byte b = (byte)300;

class DataTypeDemo7 {
	public static void main(String[] args) {
		//因为byte的范围是:-128到127。
		//而130不在此范围内,所以报错。
		//byte b = 130; 
		
		//我们可以使用强制类型转换
		byte b = (byte) 130;
		
		//结果是多少呢?
		System.out.println(b);
	}
}

分析过程:
        我们要想知道结果是什么,就应该知道是如何进行计算的。
        而我们又知道计算机中数据的运算都是补码进行的。
        而要得到补码,首先要计算出数据的二进制。
        
        A:获取130这个数据的二进制。
                   00000000 00000000 00000000 10000010(int数据4个字节)
                   这是130的原码,也是反码,还是补码。
        B:做截取操作,截成byte类型的了。
                  10000010(byte数据一个字节)
                  这个结果是补码。
        C:已知补码求原码。
                         符号位        数值位
            补码:    1              0000010
            
            反码:    1              0000001
            
            原码:    1              1111110

以上是自己今天入门JAVA浅显的认识,下面推荐一个不错关于数据类型转换的博客

https://www.cnblogs.com/liujinhong/p/6005714.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值