二进制、八进制、十六进制和十进制的相互转换,原码反码补码计算以及Java中数字的存储
1. Java中數(shù)字默認(rèn)是十進(jìn)制,二進(jìn)制、八進(jìn)制以及十六進(jìn)制的表示如下
?
2. 二進(jìn)制、八進(jìn)制、十六進(jìn)制和十進(jìn)制的相互轉(zhuǎn)換?
2.1 為了不累贅描述,本文以百度的二進(jìn)制小數(shù)轉(zhuǎn)換為十進(jìn)制小數(shù)為例,如下圖
2.2 十進(jìn)制整數(shù)轉(zhuǎn)二進(jìn)制整數(shù)以及十進(jìn)制小數(shù)轉(zhuǎn)換為二進(jìn)制小數(shù)如下
? ? ?
?
3. 原碼、反碼和補(bǔ)碼?
在理解二進(jìn)制和十進(jìn)制轉(zhuǎn)換后,對(duì)于一個(gè)整數(shù),比如 7 ,我們知道二進(jìn)制表示是 0111,但是一個(gè)負(fù)數(shù)的二進(jìn)制怎么表示呢,你有想過 -8 怎么用二進(jìn)制表示嗎?在計(jì)算機(jī)中,存儲(chǔ)的都是補(bǔ)碼,但是我們前面說的二進(jìn)制和十進(jìn)制相互轉(zhuǎn)換都是原碼形式。
3.1 對(duì)于正數(shù)來說,它的原碼、反碼和補(bǔ)碼是一樣的。
14,原碼:0000 1110,反碼:0000 1110,補(bǔ)碼:0000 1110 34,原碼:0010 0010,反碼:0010 0010,補(bǔ)碼:0010 0010?
對(duì)于負(fù)數(shù)來說,計(jì)算機(jī)規(guī)定第一位是0表示正數(shù),1表示負(fù)數(shù),那么 -14 的原碼就是 1000 1110,-34的原碼是 1010 0010.那么負(fù)數(shù)的原碼和反碼、補(bǔ)碼有什么關(guān)系呢?
3.2 負(fù)數(shù)的反碼是負(fù)數(shù)的原碼除符號(hào)位全部取反;負(fù)數(shù)補(bǔ)碼是負(fù)數(shù)反碼+1
-14,原碼:1000 1110,反碼:1111 0001,補(bǔ)碼:1111 0010 -34,原碼:1010 0010,反碼:1101 1101,補(bǔ)碼:1101 1110?
有沒有感覺這樣會(huì)有點(diǎn)不對(duì)勁,0 和 -0 以及邊界,這里以8位示例,對(duì)于原碼來說,1111 1111表示負(fù)數(shù),正數(shù)最大只能0111 1111,此時(shí)是+127;負(fù)數(shù)最小是1111 1111,此時(shí)是-127。我們學(xué)過一個(gè)字節(jié)有符號(hào)正數(shù)它的表示范圍是-128~127,那么-128怎么表示?
3.3? 感覺不對(duì)勁的 -0 和 -128 怎么表示
0,原碼:0000 0000,反碼:0000 0000,補(bǔ)碼:0000 0000-0,原碼:1000 0000,反碼:1111 1111,補(bǔ)碼:0000 0000-128,原碼:無 反碼:無 補(bǔ)碼:1000 0000因此,計(jì)算機(jī)通過存儲(chǔ)補(bǔ)碼,一個(gè)字節(jié)可以存儲(chǔ)?-128~127的范圍,沒有 0 和 -0 的區(qū)別,存儲(chǔ)的都是0000 0000. 同時(shí)因?yàn)闆]有數(shù)的補(bǔ)碼是 1000 0000,那么就直接將 1000 0000表示為 -128,以下通過Java的二進(jìn)制表示及輸出來說明。
注意:以上8位二進(jìn)制表示前需要加上(byte)類型,如果不加的話,默認(rèn)是int類型,那么程序在存儲(chǔ)時(shí)會(huì)自動(dòng)在二進(jìn)制前面補(bǔ)上24個(gè)0,那么以下所有的數(shù)字都變?yōu)檎龜?shù)。只有加上byte強(qiáng)制轉(zhuǎn)換,那么程序才會(huì)在存儲(chǔ)時(shí)以真實(shí)的8位二進(jìn)制存儲(chǔ),
System.out.println((byte)0b00000000);System.out.println();System.out.println((byte)0b00000001);System.out.println();System.out.println((byte)0b00000010);System.out.println();System.out.println((byte)0b01111110);System.out.println();System.out.println((byte)0b01111111);System.out.println();System.out.println((byte)0b10000000);System.out.println();System.out.println((byte)0b10000001);System.out.println();System.out.println((byte)0b10000010);System.out.println();System.out.println((byte)0b11111110);System.out.println();System.out.println((byte)0b11111111);?
總結(jié)
以上是生活随笔為你收集整理的二进制、八进制、十六进制和十进制的相互转换,原码反码补码计算以及Java中数字的存储的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java中的System.out.pri
- 下一篇: Java字节码解读