Java基础之关于原反补的面试题

第一题:

        byte b1=3,b2=4,b;

        b=b1+b2;

        b=3+4;

        哪句是编译失败的呢?为什么呢?

1.答案是 b = b1 + b2; 这句,因为在Java语言中整数在进行运算时都会默认int类型的变量进行运算,所以这句编译失败。

第二题:

        byte  by = 130;有没有问题?有问题如何解决?结果是多少呢?

2.有,强制转换就可以:byte by = (byte)130; ,结果:

(1).130 ---- 00000000 00000000 00000000 10000010  这是130的 二进制 同时是原码,反码,也是补码;

(2).由于强制转换为byte类型,已知byte类型是1字节8位,所以截取前面3字节16位,得到的结果是10000010(因为是正数,所以10000010也是130的补码,又因为它超过了取值范围,所以要把它转为原码,才是结果);

(3).已知补码求原码(-1得反码,取绝对值保留符号位不变得原码):

        符号位       数值位

补码      1          0000010

反码      1          0000001 

原码      1          1111110

结果是  -126;

第三题:

        byte  by = -130;有没有问题?有问题如何解决?结果是多少呢?

2.有,强制转换就可以:byte by = (byte)-130; ,结果:

(1).-130 ---- 10000000 00000000 00000000 10000010  这是-130的 二进制补码(因为在计算机中负数是用补码来计算的);

(2).由于强制转换为byte类型,已知byte类型是1字节8位,所以截取前面3字节16位,得到的结果是10000010(因为是负数,而且超过了byte类型的取值范围(10000000(-128)-01111111(127)),所以要计算它的原码);

(3).已知补码求原码(-1得反码,取绝对值保留符号位不变得原码):

        符号位       数值位

补码      1          0000010

反码      1          0000001  

原码      1          1111110

得到以上结果并不是最终结果,因为他是负数的原码,所以要去掉前面的符号位,得到126,

最终结果为  126;

第四题:

        byte  by = 300;有没有问题?有问题如何解决?结果是多少呢?

2.有,强制转换就可以:byte by = (byte)300; ,结果:

(1).300 ---- 00000000 00000000 00000001 00101100  这是300的 二进制 原码;

(2).由于强制转换为byte类型,已知byte类型是1字节8位,所以截取前面3字节16位,得到的结果是00101100(因为是正数,所以00101100也是130的原码);

(3).00101100转换为十进制为44,

最终结果为44;




如果以上文章有什么问题,欢迎大家指正








猜你喜欢

转载自blog.csdn.net/weixin_38701432/article/details/79504727