Java解惑三:循环之谜

谜题24

byte是有符号的,范围是-128 - 127。而0x90是int类型。比较的时候,不相等。
如果想让其相等,需要进行类型转换:(byte & 0xff) 或者 (byte)0x99。

谜题25

自增运算符对循环的影响。j = j++,先赋值。

谜题26

 Integer.MAX_VALUE加一之后会变成Integer.MIN_VALUE,这对循环会有影响。
可以考虑使用long来表示i变量,或者使用效率更高的i != Integer.MAX_VALUE。

谜题27

(-1 << 32)的结果是-1而不是0。
对于int型的数据移位运算总是取右端数转换成2进制的低五位。
对于long型的数据移位运算总是取右端数转换成2进制的低六位。
32取低五位是0,因此结果是-1。
如果右边的数是负数,同样保留低五(六)位,将其转换为正数。

谜题28

while(i == i + 1) {
}

当浮点数i足够大时候, i = i + 1。

相邻浮点数之间的距离被称为ulp(unit int the last place),一旦ulp超过2,加一将不会产生任何影响。

二进制浮点数算术只是一种近似。

谜题29

while(i != i) {
}
IEEE 754浮点算术保留了一个特殊的值:NaN(not a number)。
double i = 0.0 / 0.0,double i = Double.NaN,
任何浮点数操作,只要一个或多个操作数为NaN,那么结果是NaN。
NaN不等于任何浮点数,包括它自身。NaN  != NaN 。

谜题30

while(i != i + 0) {
}
i != i + 0,如果i是String类型。此时的+就不是算术加号了,被重载为字符串的连接。

谜题31

while(i != 0) {
i  >>>= 1;
}
还是在讲类型转换。
当i为short类型的-1的时候,i >>>= 1,仍旧是-1:首先将short转换为int,然后在截取低位16。
short,byte的任何负数最终都会转换为-1。而char不会,char是无符号的。

谜题32

Integer i = new Integer(0);

Integer j = new Integer(0);

while(i <= j && i >= j && i != j){

}

包装类,当使用==运算符时候,并不是判断值相等,而是引用(兼容性考虑)。<=或者>= 都是值判断。

谜题33

while(i != 0 && i == -i) {
}
整数的边界问题
0x8000 0000 表示最小的负数(Integer.MIN_VALUE),对其求相反数,仍是其本身。

谜题34

		final int START = 2000000000;
		int count = 0;
		for (float f = START; f < START + 65; f++) {
			count++;
			System.out.println(START + 65);
		}

浮点数精度问题
START+50与START相等,当使用浮点数表示的时候。50比START的ulp距离(128)的一半还小。当超过ulp的距离的一半的时候,无限循环。

谜题35

取余和乘除具有相同的优先级。

Java解惑三:循环之谜,布布扣,bubuko.com

Java解惑三:循环之谜

上一篇:Javascript 正确使用方法


下一篇:Java解惑四:异常之谜