深入理解JAVA虛擬機器學習筆記18——位元組碼指令2(運算指令)

weixin_33860553發表於2018-06-20

本篇繼續位元組碼指令的學習,開始之前,先鞏固一下基礎知識,Java中基本資料型別的範圍。

1. 整型:

1.1 byte:資料型別是8位、有符號的整數,取值範圍-128~127;

1.2 short: 資料型別是 16 位、有符號的整數,取值範圍-32768~32767;

1.3 int:資料型別是32位、有符號的整數,取值範圍為-2147483648~2147483647;

1.4 long:資料型別是 64 位、有符號的整數,取值範圍為-9223372036854774808~9223372036854774807;

2. 浮點型

2.1 float:資料型別是單精度、32位的浮點數,取值範圍是3.402823e+38 ~ 1.401298e-45(e+38表示是乘以10的38次方,同樣,e-45表示乘以10的負45次方);

2.2 double:double 資料型別是雙精度、64 位的浮點數,取值範圍是1.797693e+308~ 4.9000000e-324;

3. 布林型

boolean:佔一位,只有兩個值,true和false;

4. char型:佔16 位,用於存放字元的資料型別,採用unicode編碼,儲存範圍在\u0000~\uFFFF;

12421988-3482283daa7bf4fd.png

知道了基本的資料型別及範圍後,我們看一下運算指令都有哪些。

加法指令:iadd、ladd、fadd、dadd。

減法指令:isub、lsub、fsub、dsub。

乘法指令:imul、lmul、fmul、dmul。

除法指令:idiv、ldiv、fdiv、ddiv。

求餘指令:irem、lrem、frem、drem。

取反指令:ineg、lneg、fneg、dneg。

位移指令:ishl、ishr、iushr、lshl、lshr、lushr。

按位或指令:ior、lor。

按位與指令:iand、land。

按位異或指令:ixor、lxor。

區域性變數自增指令:iinc。

比較指令:dcmpg、dcmpl、fcmpg、fcmpl、lcmp。

12421988-493f1f3c10afd8ea.png

需要說明的是,虛擬機器沒有byte,short,char,boolean型別的算術指令,都轉換成int型別指令代替。

然後還有幾點需要注意的,我們舉例說明一下。

1. 如下圖所示,計算兩個int型數字相加;

12421988-38e615724528da98.png

執行時結果居然是-4!

這時因為相加得到的結果已經超過int所能表示的範圍,資料運算溢位,JVM對於這種情況,不會丟擲異常,而是會返回一個負數。

2. 在算術運算的時候,有一種情況會丟擲異常,那就是除法或求餘的除數為0的時候,執行下圖所示程式碼。

12421988-88763eedcc6ec3c6.png

我們可以看到執行結果,丟擲了ArithmeticException異常。

12421988-bffccd143be732a8.png

3. 對於浮點數,當最小值超過範圍的時候,會逐級下溢;當最大值超過範圍的時候,會發生上溢。

4. 浮點數運算時,預設的舍入模式為向最接近數輸入模式。

5. 浮點數轉整數的時候採用的時向零舍入,即直接將小數位舍掉。

6. 如果計算的結果沒有明確定義,那麼用NaN值來表示。

喜歡文章或想一起學習的朋友可以關注我,給我點贊,我將會持續更新,有什麼疑問或文中有不當之處請給我留言,真誠地希望能與大家一起交流探討,學習進步。

相關文章