1:在定義Long或者Float類型變量的時候,要加L或者f。 整數默認是int類型,浮點數默認是double。 byte,short在定義的時候,他們接收的實際上是一個int類型的值。 這個是本身作了一個數據檢測的,若是再也不它們的範圍內,就報錯。 2:byte值的問題 byte b1 = 127; byte b2 = (byte)128; //-128 byte b3 = (byte)129; //-127 byte b4 = (byte)130; //-126 byte的範圍:-128 ~ 127 128:10000000 -128:10000000 (這裏的1便是符號位,也是數值位) 3:數據類型轉換之默認轉換 byte,short,char -- int -- long -- float -- double long: 8個字節 float:4個字節 舉例: 17.625在內存中的存儲 首先要把17.625換算成二進制:10001.101 整數部分,除以2,直到商爲0,餘數反轉。 小數部分,乘以2,直到乘位0,進位順序取。 在將10001.101右移,直到小數點前只剩1位: 1.0001101 * 2^4 由於右移動了四位 這個時候,咱們的底數和指數就出來了 底數:由於小數點前必爲1,因此IEEE規定只記錄小數點後的就好。因此,此處的底數爲:0001101 指數:實際爲4,必須加上127(轉出的時候,減去127),因此爲131。也就是10000011 符號部分是整數,因此是0 綜上所述,17.625在內存中的存儲格式是: 01000001 10001101 00000000 00000000 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 4:Java語言中的字符char能夠存儲一箇中文漢字嗎?爲何呢? 能夠。由於java語言中的字符佔用兩個字節。 Java語言採用的是Unicode編碼。 System.out.println(x/y); //整數相除只能獲得整數 //我就想獲得小數,該腫麼辦呢? //只須要把操做的數據中任意的一個數據變爲浮點數 System.out.println(x*1.0/y); 注意事項: A:整數相除只能獲得整數。若是想獲得小數,必須把數據變化爲浮點數類型 B:/獲取的是除法操做的商,%獲取的是除法操做的餘數 &&和&的區別? 同理||和|的區別? A:最終結果同樣。 B:&&具備短路效果。左邊是false,右邊不執行。 開發中經常使用的邏輯運算符:&&,||,! ~按位取反運算符:0變1,1變0(System.out.println(~3)) 00000000 00000000 00000000 00000011 ~11111111 11111111 11111111 11111100 (補碼) 補碼:11111111 11111111 11111111 11111100 反碼:11111111 11111111 11111111 11111011(補碼減1) 原碼:10000000 00000000 00000000 00000100(反碼符號位不變,其餘位置0變1,1變0) 結果是:-4 (正數的原反補都相同) /* ^的特色:一個數據對另外一個數據位異或兩次,該數自己不變。 */ class OperatorDemo2 { public static void main(String[] args) { int a = 10; int b = 20; System.out.println(a ^ b ^ b); //10 System.out.println(a ^ b ^ a); //20 } } /* 面試題: 請本身實現兩個整數變量的交換 注意:之後講課的過程當中,我沒有明確指定數據的類型,默認int類型。 */ //方式2:用位異或實現(面試用) //左邊:a,b,a //右邊:a ^ b /* a = a ^ b; b = a ^ b; //a ^ b ^ b = a a = a ^ b; //a ^ b ^ a = b System.out.println("a:"+a+",b:"+b); */ //方式4:一句話搞定 b = (a+b) - (a=b); //b=30-20=10,a=20 System.out.println("a:"+a+",b:"+b); /* <<:左移 左邊最高位丟棄,右邊補齊0 >>:右移 最高位是0,左邊補齊0;最高爲是1,左邊補齊1 >>>:無符號右移 不管最高位是0仍是1,左邊補齊0 面試題: 請用最有效率的方式寫出計算2乘以8的結果? 2 * 8 2 << 3 */ class OperatorDemo3 { public static void main(String[] args) { //<< 把<<左邊的數據乘以2的移動次冪 System.out.println(3 << 2); //3*2^2 = 3*4 = 12; //>> 把>>左邊的數據除以2的移動次冪 System.out.println(24 >> 2); //24 / 2^2 = 24 / 4 = 6 System.out.println(24 >>> 2); System.out.println(-24 >> 2); System.out.println(-24 >>> 2); } } /* 計算出3的二進制:11 00000000 00000000 00000000 00000011 (00)000000 00000000 00000000 0000001100 >>的移動: 計算出24的二進制:11000 原碼:10000000 00000000 00000000 00011000 反碼:11111111 11111111 11111111 11100111 補碼:11111111 11111111 11111111 11101000 11111111 11111111 11111111 11101000 1111111111 11111111 11111111 111010(00) 補碼 補碼:1111111111 11111111 11111111 111010 反碼:1111111111 11111111 11111111 111001 原碼:1000000000 00000000 00000000 000110 結果:-6 >>>的移動: 計算出24的二進制:11000 原碼:10000000 00000000 00000000 00011000 反碼:11111111 11111111 11111111 11100111 補碼:11111111 11111111 11111111 11101000 11111111 11111111 11111111 11101000 0011111111 11111111 11111111 111010(00) 結果: */ //報錯 //int z = ((x = y)? x : y);//結果是一個boolean類型。 if語句第一種格式: if(關係表達式) { 語句體 } if語句第二種格式: if(關係表達式) { 語句體1; }else { 語句體2; } if語句第三種格式: if(關係表達式1) { 語句體1; }else if (關係表達式2) { 語句體2; } … else { 語句體n+1; }