Java面试题_001

面试题:
已知:

byte b1 = 3,b2 = 4,b;
//问
b = b1 + b2;//(1)
b = 3 + 4;//(2)

问:
(1),(2)哪一句是编译失败的呢?为什么?
答:
(1) b = b1 + b2;是有问题的。
因为变量相加会首先看数据类型问题,最终把结果赋值也会考虑类型问题,而题中是类型提升问题,首先 b1 和 b2 先默认转化为 int 型,再进行运算,而两个 int 型数据相加还是 int 型,赋值给 b ,而 b 是byte型数据,此时就是由大到小进行转换,会造成数据精度损失,就会报错。
而当是常量之间进行运算,会首先看类型问题,最终将结果赋值,看是否再变量的数据类型的表述范围内。

-------------------------------------------------------美丽分割线---------------------------------------------------

思考题:
已知:

byte b = 130;//有误?

问:
以上代码有没有问题?如果想要赋值正确,怎么做?结果是多少?
答:
有问题,会报错说会损失精度。
解决方案:强制转换(byte b = (byte) 130;)
显示结果是:-126
过程分析:
首先我们想要知道结果是什么,就应该知道是如何进行计算的。
而我们知道计算机中的运算都是补码进行的。
而要得到补码,首先要计算出数据的二进制。
A:获取130这个数据的二进制。(130默认的是int 型,是4个字节)
00000000 00000000 00000000 10000010
B:做截取操作,截成byte类型
10000010
因为130是正数,原码,反码,补码都是一样的
所以该数据的补码也是10000010
C:已知补码求原码

符号位 数值位
补码 1 0000010
反码 1 0000001
原码 1 1111110
                                               补码到原码的过程

所以在byte类型下,该数据是负值,根据数值位可得结果为126,加上负值为-126。

上一篇:【2019牛客暑期多校训练营(第一场) - H】XOR(线性基,期望的线性性)


下一篇:C/C++_2019_7_4(计算糖果)