(4)思考题和面试题:
A:下面两种方式有区别吗?
float f1 = 12.345f;
byte b1 = 3;
byte b2 = 4;
byte b3 = b1 + b2;
是查找ASCII里面的值
'a' 97
'A' 65
'0' 48
System.out.println('a'); 97
System.out.println('a' + 1);98
E:字符串参与运算
这里其实是字符串的连接
System.out.println("hello"+'a'+1);helloa1
System.out.println('a'+1+"hello");98hello
System.out.println("5+5="+5+5);5+5=55
System.out.println(5+5+"=5+5");10=5+5
A:下面两种方式有区别吗?
float f1 = 12.345f;
float f2 = (float)12.345;
答:有区别,float f1=12.345f定义一个float类型的变量,float f2 = (float)12.345是把double类型的12.345强制转换为float类型的变量。
B:下面的程序有问题吗,如果有,在哪里呢?byte b1 = 3;
byte b2 = 4;
byte b3 = b1 + b2;
byte b4 = 3 + 4;
答:byte b3 = b1 + b2;是有问题的因为两个byte类型的变量相加首先会把byte提升为int再做加法运算再把结果int类型的结果赋值给byte类型的变量b3会有问题
而byte b4 = 3 + 4;没问题是因为3+4是一个常量计算,然后把结果赋值给byte类型的b4,如果结果在byte的范围之类就不会报错,显然byte的范围是-127-128所以不会有问题。
C:下面的操作结果是什么呢?byte b = (byte)130;
答:结果是-126,
我们要想知道结果是什么,就应该知道是如何进行计算的。
而我们又知道计算机中数据的运算都是补码进行的。
而要得到补码,首先要计算出数据的二进制。
A:获取130这个数据的二进制。
00000000 00000000 00000000 10000010
这是130的原码,也是反码,还是补码。
B:做截取操作,截成byte类型的了。
10000010
这个结果是补码。
C:已知补码求原码。
符号位 数值位
补码: 1 0000010
反码: 1 0000001
原码: 1 1111110
是查找ASCII里面的值
'a' 97
'A' 65
'0' 48
System.out.println('a'); 97
System.out.println('a' + 1);98
E:字符串参与运算
这里其实是字符串的连接
System.out.println("hello"+'a'+1);helloa1
System.out.println('a'+1+"hello");98hello
System.out.println("5+5="+5+5);5+5=55
System.out.println(5+5+"=5+5");10=5+5