java學習-基礎(1)

一、二進制
java中int型數據一般佔用四個字節,32位,其中第32位爲符號位,0表示正,1表示負。
int型max爲:01111111 11111111 11111111 11111111=2147483647
int型min爲:10000000 00000000 00000000 00000000=-2147483648
負整數的二進制等於其正整數的二進制的反碼再加1。例如上面,max值的反碼就是min值的二進制,再加1就是-max值。

二、類型轉換
(1)自動類型轉換 。例:
byte a=1; int b=2; int c=a+b; 求得c=3;
這裏計算過程中,編譯器會自動的把佔用內存小的轉換爲佔用內存大的,即byte型會先轉換成int型,在進行計算。
(2)強制類型轉換。例:
int a=1; int b=2; byte c=a+b; //報錯,cannot convert from int to byte
此時需要做強制類型轉換,因爲從4個字節的int型轉換成一個字節的byte型會造成精度丟失等問題,所以編譯器不會幫助自動類型轉換,因爲他不知道你需要的是精度還是類型。
方法是:byte c=(byte)(a+b); 即可。

三、運算符
例子一:
(1)byte a = 1; a = 2 + 3; 輸出 a=5;沒問題
(2)byte a = 1; byte b = 2; byte c = 3; a=b+c;//報錯,cannot convert from int to byte
上面兩個例子,其實值理論上是一樣的,但是實際結果卻差別那麼大,原因在於a=2+3;這個過程中,運算的是兩個常量,二常量在編譯器眼裏是可以直接斷定值的。這時候他知道直接進行類型轉換不會影響到值本身。但是在a=b+c;中這兩個是變量,而變量在編譯器眼裏都是不確定的,很有可能發生精度丟失等問題,所以編譯器不能幫你轉換。不過從提示的錯誤來看,這裏byte型進行運算時會優先轉換成int型,輸出結果也是int型,是不能直接賦值給byte的。

例子二:
(1)int a= Integer.MAX_VALUE ; int b=1; int c=a+b; 輸出c=-2147483648
(2)int a= Integer.MAX_VALUE ; int b= Integer.MAX_VALUE; int c=a+b; 輸出c=-2

從這兩個例子中,可以看出來,最大值繼續往上加,不是報錯,而是變成負值。其實,前面提到過,第32位數是符號位,但是,在運算中,符號位是參與運算的,max值再加(可以對着二進制數運算一下),那第32位不就是進位了嗎?從0變成1,1代表的就是負數呀。

例子三:
(1)int a= Integer.MIN_VALUE ; int b= Integer.MIN_VALUE; int c=a+b; 輸出c=0
(2)int a= Integer.MIN_VALUE ; int b= Integer.MIAX_VALUE+2; int c=a+b; 輸出c=1

從結果上看,挺奇怪的。原因是32位數在運算時,如果第32位數進位了,得到33位數,這時“+”運算會捨棄第33位數,只取後面32位,那第一個結果就是0了。(2)例子中,b的值應該是-max值,但是這裏也一樣,運算結果變成正的了,用二進制數運算也發現,最高位進位了,變成了0。但是,用簡單的數學運算也會發現,max+min本來就等於-1,再加2等於1,不奇怪呀。但是計算機可不會給你來什麼加法結合律,在進行c=a+b的運算前,b的值已經計算好了,就是等於-max。只是這時候進位後捨棄的做法,恰好得到了正確的值。其實也不是恰好,應該是當初設計的時候,已經把這些都考慮好了才設計出這種運算方式,只能說牛逼。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章