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