关于数据类型转换问题byte相加系列问题分析

  偶尔碰到一些感觉很常见但是碰到了却又有些模糊的问题,然后花了点时间一下性解决下,写下来以后回来再看。

  直接看代码分析吧

 1 package myInterviewProgram;
 2 public class TestByte {
 3     /*
 4      * 首先表达式转型注意以下规则:
 5         ①所有的byte,short,char型的值将被提升为int型;
 6         ②如果有一个操作数是long型,计算结果是long型;
 7         ③如果有一个操作数是float型,计算结果是float型;
 8         ④如果有一个操作数是double型,计算结果是double型;
 9             首先2个byte类型相加,会自动提升为int,计算的结果也是int因此需要强制转化会byte,
10         而被fianl修饰的变量不会改变,会被JVM优化,当2个final修饰相加时候会根据左边变量的类型而转化,
11         作为这2个final变量的最终类型。
12      */
13     /*
14      * 基本数据类型转换:
15     各数据类型按容量大小(表数范围大小)由小到大排列为:
16      Byte, short, char  ——int ——long——float——double
17       1.转换时遵循的原则:
18      1)容量小的类型自动转换为容量的类型;
19      2)容量大的类型转换为容量小的类型时,要加强制转换符;
20     3)byte,short,char之间不会互相转换,并且三者在计算时首先转换为int类型;
21     4)实数常量默认为double类型, 整数常量默认为int类型;
22      */
23     public static void main(String[] args){
24         
25         byte a =1,b=2,l=127;
26         final byte e=3,f=4,t=127;
27         int k = 3;
28         //先来最基本的:
29 //        a = k;//编译错误,int型赋值给byte需要强制类型转换
30         k = a;//编译通过,byte可以直接转换成为int型及以上基本数据类型
31         System.out.println(k);
32         
33         int x = a+b;//编译通过,两个byte型数据相加自动转换为int型
34 //        byte x1 = a+b;//这句报错,因为byte类型数据在计算时会自动转换成为int型参与计算,所以a+b得到的结果是int型的
35         byte x1 = (byte) (a+b);//int型强转byte,精度会丢失
36         
37         byte x2 = a++;//编译通过
38         int x3 = a++;//编译也通过
39         byte x4_ = ++l;//编译居然通过了,结果为-128,其实是先转换成了int型结果自增为128,但是byte型范围最大为127,底层自动发生了向下转换,丢失了精度。
40 //        byte x4 = 1++;//编译不通过,说明++操作底层也是自动转换了int型
41 //        byte x4 = e++;//编译不通过
42 //        byte x4 = ++t;//编译不通过,通过与上一条语句对比说明,经过final修饰的byte基本数据类型变量,经过++、--操作都不能赋值给非final。
43         
44 //        byte x5 = a+1;//编译不通过,原因:1为int型,与byte型数据相加结果自动转int
45         byte x5 = 1+2;//编译通过了,首先要注意1、2这是两个常量,编译器会直接将这两个常量相加后赋值,
46         //相当于直接赋值操作,所以正确。
47         System.out.println(x4_);
48         
49         int y = e+f;//编译通过
50         byte y1 = e+f;//编译也通过,说明当两个byte型都被final修饰时,相加byte,int都是正确的。我们可以这样理解,经过final修饰
51         //的变量是不可改变的,所以可以当常量处理,相当于先计算了两个byte常量值,再将结果赋值给左边的变量,也就是初始化操作。
52         //必须要说明的,当e+f的结果超过byte范围-128-127时,此时赋值就会报错。
53         
54         int z = a+e;//编译通过
55 //        byte z1 = a+e;//报错,通过对比说明只要有byte型数据相加,都会发生向上转型为int,不管其中是否一个是final
56         byte z1 = (byte) (a+e);//可以通过强转型
57 //        System.out.println(x2);
58         
59     }
60 }
总结下:
1、对于数据类型的相加
当操作数是byte,short,char时,会自动转化为int类型;返回结果为int。当操作数是int,long时,不转化,原来是啥类型,还是啥类型。
2、对于有final修饰的基本数据类型,当两个操作数都被final修饰,可以直接当常量处理,例如相加操作,会直接相加取结果再如初始化方式赋值,所以左边变量数据类型只要是在结果范围类都是正确的;当两个操作数有一个不是final,最后会将结果转换为int型,如果左边不是int型变量,需要转换数据类型。
3、对于++、--操作,经过final修饰的变量不能直接赋值给非final型,否则直接报错。。但是允许其中一个是final型,只不过最后结果是int型,需要强转。

  

 

转载于:https://www.cnblogs.com/lmy-foolishbird/p/5263746.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值