深入理解JAVA虛擬機學習筆記18——字節(jié)碼指令2(運算指令)

本篇繼續(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ù)更新,有什么疑問或文中有不當之處請給我留言,真誠地希望能與大家一起交流探討,學習進步。

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容