java 简单有趣的二道面试题

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_36570464/article/details/88408825
昨天早上在从新看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

好了。到这里就完成了,如有错误欢迎留言指导,如果你举得好看,欢迎点好看噢。
我微信公众号:
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_36570464/article/details/88408825