本篇繼續(xù)字節(jié)碼指令的學習,開始之前,先鞏固一下基礎知識,Java中基本數(shù)據(jù)類型的范圍。
1. 整型:
1.1 byte:數(shù)據(jù)類型是8位、有符號的整數(shù),取值范圍-128~127;
1.2 short:?數(shù)據(jù)類型是 16 位、有符號的整數(shù),取值范圍-32768~32767;
1.3 int:數(shù)據(jù)類型是32位、有符號的整數(shù),取值范圍為-2147483648~2147483647;
1.4 long:數(shù)據(jù)類型是 64 位、有符號的整數(shù),取值范圍為-9223372036854774808~9223372036854774807;
2. 浮點型
2.1 float:數(shù)據(jù)類型是單精度、32位的浮點數(shù),取值范圍是3.402823e+38 ~ 1.401298e-45(e+38表示是乘以10的38次方,同樣,e-45表示乘以10的負45次方);
2.2 double:double 數(shù)據(jù)類型是雙精度、64 位的浮點數(shù),取值范圍是1.797693e+308~ 4.9000000e-324;
3. 布爾型
boolean:占一位,只有兩個值,true和false;
4. char型:占16 位,用于存放字符的數(shù)據(jù)類型,采用unicode編碼,存儲范圍在\u0000~\uFFFF;

知道了基本的數(shù)據(jù)類型及范圍后,我們看一下運算指令都有哪些。
加法指令: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。

需要說明的是,虛擬機沒有byte,short,char,boolean類型的算術指令,都轉(zhuǎn)換成int類型指令代替。
然后還有幾點需要注意的,我們舉例說明一下。
1. 如下圖所示,計算兩個int型數(shù)字相加;

運行時結果居然是-4!
這時因為相加得到的結果已經(jīng)超過int所能表示的范圍,數(shù)據(jù)運算溢出,JVM對于這種情況,不會拋出異常,而是會返回一個負數(shù)。
2. 在算術運算的時候,有一種情況會拋出異常,那就是除法或求余的除數(shù)為0的時候,運行下圖所示代碼。

我們可以看到運行結果,拋出了ArithmeticException異常。

3. 對于浮點數(shù),當最小值超過范圍的時候,會逐級下溢;當最大值超過范圍的時候,會發(fā)生上溢。
4. 浮點數(shù)運算時,默認的舍入模式為向最接近數(shù)輸入模式。
5. 浮點數(shù)轉(zhuǎn)整數(shù)的時候采用的時向零舍入,即直接將小數(shù)位舍掉。
6. 如果計算的結果沒有明確定義,那么用NaN值來表示。
喜歡文章或想一起學習的朋友可以關注我,給我點贊,我將會持續(xù)更新,有什么疑問或文中有不當之處請給我留言,真誠地希望能與大家一起交流探討,學習進步。