我剛剛通過Java bytecode instruction listings閱讀並想知道:ifne和ifnonnull有何區別?
是什麼在Java字節碼ifne
和ifnonnull
之間的區別?
我知道,在一個高級語言(例如,Java)的值0
是有一定的操作(如加法,減法,乘法),並可以與其它數值的數值,而null
是一個值,代表「沒有價值」。
我想我遇到的一個問題是我不知道如何在Bytecode/assembly中代表null
。
我剛剛通過Java bytecode instruction listings閱讀並想知道:ifne和ifnonnull有何區別?
是什麼在Java字節碼ifne
和ifnonnull
之間的區別?
我知道,在一個高級語言(例如,Java)的值0
是有一定的操作(如加法,減法,乘法),並可以與其它數值的數值,而null
是一個值,代表「沒有價值」。
我想我遇到的一個問題是我不知道如何在Bytecode/assembly中代表null
。
JVM規範對此可能更清楚。
所以對於ifne
(and ifeq
etc)的限制是:
一種
ifeq
指令是類型安全當且僅當一個可以有效地彈出一個類型匹配INT關閉輸入操作數堆棧產生的出射型狀態NextStackFrame,並且指令的操作數,Target是一個有效的分支目標,假定NextStackFrame的傳入類型狀態。
而對於ifnonnull
的限制是:
一種ifnonnull指令是類型安全當且僅當一個可以有效地彈出一個類型匹配的參考關輸入操作數堆棧產生的出射型狀態NextStackFrame,以及操作數假定NextStackFrame的傳入類型狀態,指令Target是有效的分支目標。
基本上ifeq
和ifne
是整數值,而ifnonnull
爲參考值。
要比較兩個參考的相等性,請改用if_acmpeq
。 ifnonnull
實際上是一個特例,那裏只有一個操作數,因爲它總是與null比較。
在的null
參考如何在數據,JVM規範explicitly allows this to be implementation-specific表示術語:
基準值也可以是專用空引用,以沒有對象的引用,這將被表示這裏由null。空引用最初沒有運行時類型,但可以轉換爲任何類型。引用類型的默認值爲null。
Java虛擬機規範不要求編碼爲null的具體值。
你能不能也請告訴我'null'是如何編碼的? –
@moose:我懷疑在許多情況下,它將是一個全零比特模式的參考值,但正如我所說它是特定於JVM的。 –