1,看下面程序输出什么?
public class InTheLoop {
public static final int END = Integer.MAX_VALUE;
public static final int START = END - 100;
public static void main(String[] args) {
int count = 0;
for (int i = START; i <= END; i++)
count++;
System.out.println(count);
}
}
解答:死循环(infinite loop)。原因是一个int,是不可能大于Integer.MAX_VALUE的,当到达Integer.MAX_VALUE之后继续加1,就会默认的变为Integer.MIN_VALUE,所以形成了无限循环。这就提醒我们在处理integral type(包括byte, char, short ,int 和 long)的时候,要小心取值范围。
2、JVM中整数的“/”和“%”运算:
a/b=+(a绝对值/b绝对值)取地板 (ab同号、b!=0)
=-(a绝对值/b绝对值)取地板 (ab异号、b!=0)
eg:7/-3=-1,25/4=6
a%b=+(a绝对值%b绝对值) (a>=0、b!=0)
=-(a绝对值%b绝对值) (a<=0、b!=0)
eg:15%-4=3,-15%-4=-3
3、用移位运算效率较高:
public static boolean isOdd(int i){//判断是否为奇数
return(i & 1) == 1;
}
4、当赋值运算符出现在if或输出语句上时:首先进行赋值,其次把等号右边的结果作为整个表达式的结果。
例1:
boolean b=true;
if(b = false){
System.out.println(b);
System.out.println("haha");
}
输出:
false
haha
--------------
例二:
boolean b=true;
System.out.println(b=false);
System.out.println(b);
输出为:
false
false
5、当计算大数字的时候,要小心overflow,variable的类型只能决定最后的存储类型,不能决定中间计算时的临时存储类型。比如
long i = 10000000000000000000000000000 / 1000000000000;
6、位扩展
a)位扩展(widen primitive conversion)时,正数高位补0,负数高位补1。
b)计算前,正数和零存为原码,负数存为补码(去反加一)
eg:Long.toHexString(0x100000000L + 0xcafebabe)打印为多少?0xcafebabe变为Long型为0xffffffffcafebabe 加 0x100000000L = 0x100000000cafebabe,最高位1overflow,结果为0xcafebabe。
c)char型占16位,是0——65535,不含负数,故char位扩展时高位全补0
eg:(int)(char)0xff输出为65535。
posted on 2006-06-26 17:41
保尔任 阅读(183)
评论(0) 编辑 收藏