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);
????}
}
解答:死循環(huán)(infinite loop)。原因是一個(gè)int,是不可能大于Integer.MAX_VALUE的,當(dāng)?shù)竭_(dá)Integer.MAX_VALUE之后繼續(xù)加1,就會(huì)默認(rèn)的變?yōu)镮nteger.MIN_VALUE,所以形成了無(wú)限循環(huán)。這就提醒我們?cè)谔幚韎ntegral type(包括byte, char, short ,int 和 long)的時(shí)候,要小心取值范圍。
2、JVM中整數(shù)的“/”和“%”運(yùn)算:
a/b=+(a絕對(duì)值/b絕對(duì)值)取地板? (ab同號(hào)、b!=0)
?????=-(a絕對(duì)值/b絕對(duì)值)取地板? (ab異號(hào)、b!=0)
eg:7/-3=-1,25/4=6
a%b=+(a絕對(duì)值%b絕對(duì)值)?????? (a>=0、b!=0)
?????? =-(a絕對(duì)值%b絕對(duì)值)?????? (a<=0、b!=0)
eg:15%-4=3,-15%-4=-3
3、用移位運(yùn)算效率較高:
public static boolean isOdd(int i){//判斷是否為奇數(shù)
??? return(i & 1) == 1;
}
4、當(dāng)賦值運(yùn)算符出現(xiàn)在if或輸出語(yǔ)句上時(shí):首先進(jìn)行賦值,其次把等號(hào)右邊的結(jié)果作為整個(gè)表達(dá)式的結(jié)果。
例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、當(dāng)計(jì)算大數(shù)字的時(shí)候,要小心overflow,variable的類型只能決定最后的存儲(chǔ)類型,不能決定中間計(jì)算時(shí)的臨時(shí)存儲(chǔ)類型。比如
long i = 10000000000000000000000000000 / 1000000000000;
6、位擴(kuò)展
a)位擴(kuò)展(widen primitive conversion)時(shí),正數(shù)高位補(bǔ)0,負(fù)數(shù)高位補(bǔ)1。
b)計(jì)算前,正數(shù)和零存為原碼,負(fù)數(shù)存為補(bǔ)碼(去反加一)
eg:Long.toHexString(0x100000000L + 0xcafebabe)打印為多少?0xcafebabe變?yōu)長(zhǎng)ong型為0xffffffffcafebabe 加 0x100000000L = 0x100000000cafebabe,最高位1overflow,結(jié)果為0xcafebabe。
c)char型占16位,是0——65535,不含負(fù)數(shù),故char位擴(kuò)展時(shí)高位全補(bǔ)0
eg:(int)(char)0xff輸出為65535。