1、数据类型
2、数据类型的转换:
①默认转换(从小精度到大精度)
●byte,short,char—>int—>long—>float—>double
注意:
long:8字节
float:4字节
为何默认转换却把long转成float呢?
原因如下:
A.它们底层的存储结构不同
B.float表示的数据范围比long的范围要大
long: 2^63 - 1
float: 3.4*10^38 > 2*10^38 > 2*8^38 = 2*2^3^38 = 2*2^114 >2^63-1
●byte,short,char相互之间补转换,他们参与运算首先转换为int类型
如图:
②强制转换(从大精度到小精度)
目标类型 变量名=(目标类型)(被转换的数据);
③boolean类型不能转换为其他的数据类型
④面试题:
题一:
byte b1=3,b2=4,b;
b=b1+b2;
b=3+4;
哪句是编译失败的呢?为什么呢?
答案:
b=b1+b2 编译报错
b=3+4 编译通过
因为b1、b2是byte类型的值,两个byte值相加的时候系统会先把b1、b2的值转换成int类型,然后再实现加法运算。这样得到的结果依旧是int型,在赋值给b的时候就会出现报错,这里会丢失精度。
而3+4中,3和4都是常量,常量的加法是先计算出结果,然后看结果是否在byte的范围内,如果在就不报错,如果不再就不报错。因此这里并不会报错。
题二:
byte b = 130;有没有问题?如果我想让赋值正确,可以怎么做?结果是多少呢?
答案:有问题,会出现编译出错。因为byte的范围是-128~127,130超出了这个范围,所以会报错。
想让赋值正确就必须使用强制类型转换,及 byte b = (byte) 130 ;
输出结果:-126
分析原因:
A:要知道在计算机中运算都是以补码进行的,因此首先要知道130的二进制表示。因为130是整型常量,因此使用4位二进制数表示,即
00000000 00000000 00000000 10000010
因为130是正数,因此其原码反码补码相同。
B:强制转换要做截取操作,截成byte类型,即一个八进制位:
10000010
这个结果是补码,是一个负数。
C:已知补码求原码:
符号位 数值位
补码: 1 0000010
反码: 1 0000001
原码: 1 1111110
由上可得:b = -126
3、字符数据和字符串参与运算
由以下代码即可看出端倪:
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
从代码和结果可以看出,字符串数据和其他数据做+,结果是字符串类型。这里的+不是加法运算,而是字符串连接符。
面试题:Java语言中的字符char可以存储一个中文汉字吗?为什么?
答:可以,因为java语言中字符占两个字节。
注:Java语言采用的是Unicode编码