Java学习笔记12——数据类型思考题
思考题1:
请问以下代码有没有问题?
double b=12.34;
float f=d;
第二行代码错误。double转换到float需要强转。float f=(float)d
思考题2:
看程序说明有没有问题?
float f1=(float)12.340;
float f2=12.34F;
没有问题的
第一行强转
第二行本身就是float类型
面试题3:
byte b1=3,b2=4,b;
b=b1+b2;
b=3+4;
哪句是翻译失败的呢?为什么?
第二句会出现问题,b=b1+b2是有问题的
1、变量相加首先会看类型问题,最终会把结果的赋值也会考虑类型的问题
byte,short,char相互之间不转换,它们参与运算首先转换为int类型
3和4都是整数int,所以赋值后的b1和b2也是int数据类型,两个int类型的变量相加结果也应该为int类型
但是b是byte数据类型,所以要想得到结果必须是强转
2、常量之间相加,首先会做加法运算,然后看这个结果是不是在数据接收范围之内,如果在就直接赋值,不会报错
如题目所示:首先计算b=3+4=7,然后因为b是byte数据类型,byte数据类型的范围在-128~127之间,7处于范围内,所以7直接赋值给b
加法运算结果处于byte范围的情况:
加法运算结果大于byte范围的情况:
思考题4:
byte=130;
有没有问题?如果我想让赋值正确,可以怎么做?结果是多少呢?
分析过程:
我们要想知道结果是什么,就得明白计算机内部如何运算的。
我们知道计算机中的数据运算都是通过补码进行的。
想要得到补码就必须知道反码,原码。
而想要知道原码,就必须知道对应的二进制
1、计算出130这个数据对应的二进制
整数默认是int类型,占4个字节
00000000 00000000 00000000 10000010
这就是130的原码,也是反码和补码,三码统一
2、强制类型转换(做了截取操作)
10000010
这个计算机截取之后的结果是计算机用来运算的补码
3、已知补码求原码
符号位 数值位
补码: 1 0000010
反码: 1 0000001
原码: 1 1111110
把原码换算成十进制(通过8421码)
64+32+16+8+4+2=126
由于符号位是1,所以结果是-126


浙公网安备 33010602011771号