昨天早上在从新看Java基础的时候,遇到几道面试题,觉得有意思,不难,就打算写下来,但是忙着就给忘了,今天就来补上。
读者可以先看了题目思考思考,然后再看后面解答。
题目(1):
byte b1 = 3, b2 = 4, b;
b = b1 + b2;
b = 3 + 4;
//问 那句编译失败的??为什么??
题目(2):
byte b = 130; //有没有问题?如果想让赋值正确,可以怎么做?结果是多少?
题目都看了吧!如果基础不太好容易进坑呢。哈哈哈
那么我们先来看看题目一吧。
本题出发点是数据类型转换,第一行是定义初始化,好像没啥问题,那我们来看看第二行, b1 ,b2 ,b 都是byte 类型,相加在赋值好像也没啥问题呢!注意了,如果不仔细就掉进坑里了呢。
因为在这里b1 + b2 变为 int 类型了(加法运算都是int类型),然后把一个int 类型 赋值给 byte 类型,当然会发生错误了,精度会丢失噢!!
好了,现在来看看第三行 b = 3 + 4 ; 说实话,开始我就在这里掉坑了(还是基础太差)。为啥呢?因为 3 ,4 是常量,相加后还是一个常量,所以把一个常量赋值给byte,你举得会出错吗??
现在我们来看看第二题。先吐槽一下,这题目还有脑子吗?都问让赋值正确了还问有没有问题!!哈哈哈哈,这都不重要,重要的是结果是多少,这个就比较有趣了,我们来分析分析。
经过了第一题,如果把一个常量赋值给一个byte类型,好像没错呢,为啥这里又出问题了呢? 当然是 没有考虑取值范围的原因了。
我们先来看看Java中各个数据类型的取值范围:
(此图来源网上)
通过上面我们可以发现,byte 的范围是-128到127 ,显然把130 赋值给一个byte会出错的,我们可以用强制类型转换
byte b = (byte)130
当然强制类型转换后,结果是多少?我们来分析一下:
计算机中的数据运算是通过补码进行的。
130 二进制 00000000 00000000 00000000 10000010
因为是正数,所以补码即是原码。
做强制转换(截取操作)为byte 类型。
10000010
注意这里是补码。
我们要的是原码(补码数值位取反
(取反为:111111101)加一(11111110))
所以原码为:11111110 即 - 126
所以最后结果是:-126
好了。到这里就完成了,如有错误欢迎留言指导,如果你举得好看,欢迎点好看噢。
我微信公众号: