package test.面试题;
public class Test1 {
public static void main(String[] args){
byte b1=3,b2=4,b;
/*
b=b1+b2;
因为在进行运算之前会进行类型的提升,将两个byte都转化成为int进行运算,所以得到的值是int型的,不能用byte接受
*/
b=3+4;
/*
不会报错,针对变量的运算会先进性类型的判断再将运行的结构进行类型的判断
如果是针对常量的的运算,使用的是先进行值得运算,再判断值是不是在类型的区间内,进行类型判断,byte可以接受7
*/
/**
* byte short lontg之间的运算直接转成int再运算
*/
}
}
package test.面试题;
import java.io.ObjectInputStream.GetField;
public class Test2 {
public static void main(String[] args){
/*
byte b=130;会报错吗?如何让它不报错,然后得到的结果是什么?
*/
/* 130>127,所以报错,范围超出! 让它不报错,强制类型转换成byte就好了
byte b=(byte)130;
强转成byte类型,就是截取长度,可能丢失精度
首先写出130的int类型的补码,计算机里面存储的是补码。正数的原补反相等,130=128+2,
00000000 00000000 00000000 10000010
得到10000010 这是补码,
转换成为原码
反码: 1 0000001
原码: 1 1111110 0 1111111为127,所以1111110=-126
* */
byte b=(byte)130;
System.out.println(b);
}
}
package test.面试题;
public class Test3 {
/**
* Java中char可以存储中文汉字吗?
* 可以,因为char占两个字节。汉字占位两个字节,Java中使用的是Unicode编码
*/
}
package test.面试题;
public class Test4 {
/**
* short s=1;s=s+1;s+=1;
*
* @param args
*/
public static void main(String[] args){
/**
* 第一句是将常量1赋值给s,1在short的范围内,没有问题
* 第二句是将s和1的相加的运算结果赋值给s,因为short byte char在进行运算的时候自动转换成为int类型,所以右边得到的是int类型会产生错误,可能损失精度
* 第三句不会报错,这点注意:虽然在值得方面s+=1和s=s+1没有区别,但是其实s+=1这种语句隐含了一个强制类型转换,s+=1相当于s=(s的数据类型)(s+1);
*/
}
}
package test.面试题;
public class Test5 {
public static void main(String[] args){
/**
* a=x,b=y;进行a和b的互相转换,多种方法。
* 这里以a=10,b=20为例子
*/
/**
一:中间介质法:
int a=10,b=20;
int c=a;
int a=b;
int b=c;
System.out.println("a="+a+"\tb="+b);
二:加减运算:
int a=10,b=20;
a=a+b;
b=a-b;
a=a-b;
System.out.println("a="+a+"\tb="+b);
三:位异或达到:
a=a^b;
b=a^b;
a=a^b;
分析: a=x,b=y
a=x^y;
b=x^y^y=x;
a=x^y^x=y;
四:一句话搞定:
a=a+b-(b=a);
解读:
相当于b1=b,b=a;a=a+b1-b;
也就是第一种的整合版本
*/
int a=10,b=20;
a=a+b-(b=a);
System.out.println("a="+a+"\tb="+b);
}
}
package test.面试题;
public class Test6 {
/**
怎么最快算出2*8的值
答:2>>>3
计算机底层使用的是补码进行运算
>>>比>>少一步判断
*/
}