java 数据类型
引用类型
基本数据类型:
boolean 占 1 个二进制位
byte 8
char 16
short 16
int 32
long 64
float 32
double 64
第一个二进制位表示符号位 0 表示 正数,1 表示为负数.
对于单精度浮点数来说第一个二进制位表示符号位,后2-9个二进制位用来表示指数,后23个二进制位则用来表示尾数。
浮点数进行运算是有可能是会损失精度的,例如:
System.out.println(1.0 - 0.9);
//结果为 0.09999999999999998
出现这种情况的原因为:java 中浮点默认是用 double 类型的,计算机在处理数据的时候先把数据转为二进制,但是小数转二进制就会损答精度,例如:0.1(十进制) 要转到二进制,
0.1 * 2 = 0.2 取 正数部份 0
0.2 * 2 = 0.4 0
0.4 * 2 = 0.8 0
0.8 * 2 = 1.6 1
0.6 * 2 = 1.2 1
0.2 * 2 = 0.4 0
...... ......
这样是永远不会等于零的,就像10 除以 3 一样,无限循环,但是double类型的数据只占那么多个二进制位,所以在在转向二进制的时候就相对数值会小一点点(非常小),所以结果会出现 0.09999999999999998这样的结果,JDK 会提供了一个可以求任意精度数值的一个类——BigDecimal。
float f1 = 1.22222222222222222222222222222222222222222222222f;
float f2 = 1.00000000000000000000000000000000000000000000001f;
System.out.println("f1 - f2 = "+(f1 - f2));
BigDecimal b1 = new BigDecimal("1.22222222222222222222222222222222222222222222222");
BigDecimal b2 = new BigDecimal("1.00000000000000000000000000000000000000000000001");
BigDecimal subtract = b1.subtract(b2);
System.out.println("b1 - b2 = "+subtract);
//打印的结果
//f1 - f2 = 0.22222221
//b1 - b2 = 0.22222222222222222222222222222222222222222222221
&与运算
&& 短路与
int i = 1;
if (i > 0 & i++ > 1) {
}
System.out.println(i);
int j = 1;
if (j < 0 && j++ > 1) {
}
System.out.println(j);
//打印结果: 2 1
与运算符会两边的表达示都会进行计算,就算编绎器知道了第一个表达式为false,而短路与则不同,在上述例子中 当 j < 0 是等于 false 时,这时整个表达式己经确定为false 了,所以编绎器对第二个表达式是不进算运算的,所以打印的结果为 n = 1
^ 异或运算符
int a = 3;
int b = 4;
System.out.println(a ^ b);
//打印结果: 7
011
^100
111
异或运算当两个二进制位相同则等于0,不相同则等于1