官术网_书友最值得收藏!

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ù)。

主站蜘蛛池模板: 无锡市| 土默特左旗| 西藏| 墨玉县| 葫芦岛市| 福建省| 东源县| 平南县| 灵武市| 曲阳县| 应用必备| 巴林右旗| 中西区| 酒泉市| 独山县| 东明县| 定州市| 巴青县| 石河子市| 温宿县| 巴东县| 侯马市| 双柏县| 抚顺市| 潮安县| 万荣县| 九龙县| 贡山| 如东县| 普格县| 乌鲁木齐县| 洪洞县| 连云港市| 莆田市| 永安市| 靖安县| 会理县| 台东市| 临漳县| 锡林浩特市| 射洪县|