二进制、八进制、十六进制和十进制的相互转换,原码反码补码计算以及Java中数字的存储
1. Java中數字默認是十進制,二進制、八進制以及十六進制的表示如下
?
2. 二進制、八進制、十六進制和十進制的相互轉換?
2.1 為了不累贅描述,本文以百度的二進制小數轉換為十進制小數為例,如下圖
2.2 十進制整數轉二進制整數以及十進制小數轉換為二進制小數如下
? ? ?
?
3. 原碼、反碼和補碼?
在理解二進制和十進制轉換后,對于一個整數,比如 7 ,我們知道二進制表示是 0111,但是一個負數的二進制怎么表示呢,你有想過 -8 怎么用二進制表示嗎?在計算機中,存儲的都是補碼,但是我們前面說的二進制和十進制相互轉換都是原碼形式。
3.1 對于正數來說,它的原碼、反碼和補碼是一樣的。
14,原碼:0000 1110,反碼:0000 1110,補碼:0000 1110 34,原碼:0010 0010,反碼:0010 0010,補碼:0010 0010?
對于負數來說,計算機規定第一位是0表示正數,1表示負數,那么 -14 的原碼就是 1000 1110,-34的原碼是 1010 0010.那么負數的原碼和反碼、補碼有什么關系呢?
3.2 負數的反碼是負數的原碼除符號位全部取反;負數補碼是負數反碼+1
-14,原碼:1000 1110,反碼:1111 0001,補碼:1111 0010 -34,原碼:1010 0010,反碼:1101 1101,補碼:1101 1110?
有沒有感覺這樣會有點不對勁,0 和 -0 以及邊界,這里以8位示例,對于原碼來說,1111 1111表示負數,正數最大只能0111 1111,此時是+127;負數最小是1111 1111,此時是-127。我們學過一個字節有符號正數它的表示范圍是-128~127,那么-128怎么表示?
3.3? 感覺不對勁的 -0 和 -128 怎么表示
0,原碼:0000 0000,反碼:0000 0000,補碼:0000 0000-0,原碼:1000 0000,反碼:1111 1111,補碼:0000 0000-128,原碼:無 反碼:無 補碼:1000 0000因此,計算機通過存儲補碼,一個字節可以存儲?-128~127的范圍,沒有 0 和 -0 的區別,存儲的都是0000 0000. 同時因為沒有數的補碼是 1000 0000,那么就直接將 1000 0000表示為 -128,以下通過Java的二進制表示及輸出來說明。
注意:以上8位二進制表示前需要加上(byte)類型,如果不加的話,默認是int類型,那么程序在存儲時會自動在二進制前面補上24個0,那么以下所有的數字都變為正數。只有加上byte強制轉換,那么程序才會在存儲時以真實的8位二進制存儲,
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);?
總結
以上是生活随笔為你收集整理的二进制、八进制、十六进制和十进制的相互转换,原码反码补码计算以及Java中数字的存储的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java中的System.out.pri
- 下一篇: Java字节码解读