- 實(shí)戰(zhàn)Java虛擬機(jī):JVM故障診斷與性能優(yōu)化(第2版)
- 葛一鳴
- 934字
- 2024-01-08 16:10:52
1.5.1 整數(shù)在Java虛擬機(jī)中的表示
在Java虛擬機(jī)中,整數(shù)有byte、short、int、long四種,分別表示8位、16位、32位、64位有符號整數(shù)。整數(shù)在計(jì)算機(jī)中使用補(bǔ)碼表示,在Java虛擬機(jī)中也不例外。在學(xué)習(xí)補(bǔ)碼之前,必須先理解原碼和反碼。
所謂原碼,就是符號位加上數(shù)字的二進(jìn)制表示。以int為例,第1位表示符號位(正數(shù)或者負(fù)數(shù)),其余31位表示該數(shù)字的二進(jìn)制值。
10的原碼為:00000000 00000000 00000000 00001010
-10的原碼為:10000000 00000000 00000000 00001010
對于原碼來說,絕對值相同的正數(shù)和負(fù)數(shù)只有符號位不同。
反碼就是在原碼的基礎(chǔ)上,符號位不變,其余位取反,以-10為例,其反碼為:
11111111111111111111111111110101
負(fù)數(shù)的補(bǔ)碼就是反碼加1,整數(shù)的補(bǔ)碼就是原碼本身。
因此,10的補(bǔ)碼為:
00000000 00000000 00000000 00001010
而-10的補(bǔ)碼為:
11111111111111111111111111110110
在Java中,可以使用位運(yùn)算查看整數(shù)中每一位的實(shí)際值,方法如下:

以上代碼將打印-10在虛擬機(jī)內(nèi)的實(shí)際表示,程序的執(zhí)行結(jié)果如下:

可以看到,這個結(jié)果和之前補(bǔ)碼的計(jì)算結(jié)果是完全匹配的。
這段程序的基本思想是:進(jìn)行32次循環(huán)(因?yàn)閕nt有32位),每次循環(huán)取出int值中的一位,第3行的0x80000000是一個首位為1、其余位為0的整數(shù),通過右移i位,定位到要獲取的第i位,并將除該位外的其他位統(tǒng)一設(shè)置為0,而該位不變,最后將該位移至最右,并進(jìn)行輸出。
相對于原碼,使用補(bǔ)碼作為計(jì)算機(jī)內(nèi)的實(shí)際存儲方式至少有以下兩個好處。
(1)可以統(tǒng)一數(shù)字0的表示。由于0既非正數(shù),又非負(fù)數(shù),使用原碼表示時符號位難以確定,把0歸入正數(shù)或者負(fù)數(shù)得到的原碼是不同的。但是使用補(bǔ)碼表示時,無論把0歸入正數(shù)還是負(fù)數(shù)都會得到相同的結(jié)果。計(jì)算過程如下。
如果0為正數(shù),則補(bǔ)碼為原碼本身:00000000 00000000 00000000 00000000。
如果0為負(fù)數(shù),則補(bǔ)碼為反碼加1,負(fù)數(shù)0的原碼為:
10000000 00000000 00000000 00000000
反碼為:
11111111 11111111 11111111 11111111
補(bǔ)碼在反碼的基礎(chǔ)上加1,結(jié)果為:
00000000 00000000 00000000 00000000
可以看到,使用補(bǔ)碼作為整數(shù)編碼,可以解決數(shù)字0的存儲問題。
(2)使用補(bǔ)碼可以簡化整數(shù)的加減法計(jì)算,將減法計(jì)算視為加法計(jì)算,實(shí)現(xiàn)減法和加法的完全統(tǒng)一,實(shí)現(xiàn)正數(shù)和負(fù)數(shù)加法的統(tǒng)一。現(xiàn)使用8位(byte)整數(shù)說明這個問題。
計(jì)算-6+5的過程如下。
-6的補(bǔ)碼:11111010
5的補(bǔ)碼:00000101
直接相加得:11111111
通過計(jì)算可知,11111111表示-1。
計(jì)算4+6的過程如下。
4的補(bǔ)碼:00000100
6的補(bǔ)碼:00000110
直接相加得:00001010
通過計(jì)算可知,00001010表示10(十進(jìn)制)。
可以看到,使用補(bǔ)碼表示時,只需要將補(bǔ)碼簡單地相加,即可得到算術(shù)加法的正確結(jié)果,而無須區(qū)別正數(shù)或者負(fù)數(shù)。
- Android平板電腦開發(fā)實(shí)戰(zhàn)詳解和典型案例
- 深入理解Net-Snmp
- 軟件需求與可視化模型(微軟技術(shù)叢書)
- 企業(yè)性能測試:體系構(gòu)建、落地指導(dǎo)與案例解讀
- 經(jīng)·理@互聯(lián)網(wǎng)產(chǎn)品經(jīng)理的進(jìn)階修煉
- 產(chǎn)品經(jīng)理入門攻略
- Python與數(shù)據(jù)挖掘
- Swift開發(fā)實(shí)戰(zhàn)
- 網(wǎng)絡(luò)DevOps平臺規(guī)劃、設(shè)計(jì)與實(shí)踐:基于企業(yè)架構(gòu)(EA)和領(lǐng)域建模(DDD)的方法
- 搜索引擎與程序化廣告:原理、設(shè)計(jì)與實(shí)戰(zhàn)
- Android5.0新特性實(shí)戰(zhàn)
- C語言點(diǎn)滴
- 從隱秩序到顯規(guī)則:工程體系基于V++規(guī)則引擎的生態(tài)演進(jìn)
- 計(jì)算機(jī)網(wǎng)絡(luò)系統(tǒng)集成技術(shù)基礎(chǔ)與解決方案
- 現(xiàn)代交換技術(shù)(第3版)