計算機中的進制
在學習編程的過程中,經常見到二進制,十進制,十六進制,到底進制表示什麽意思呢?進制,字面意思,前進的制度,在數字方面,就是數字前進的制度,數字怎麽向前進,那就是進位,我們在做加法運算的時候都會用到進位,8+3,我們會寫個1,然後向前進一位,數數的時候更是如些,1,2,3......10, 我們不會再向下數11,12 ..... ,而是在心中放一個1, 然後再1,2,3,4,......10, 到10之後, 我們也不會向下數,而是在心中再記一個1,那麽心中的數字就是2了,繼續向下數,1,2,3,數完了,沒有到10, 我們就直接記下3,最後統計一下,心中的2乘以10,再加上3,就是23。數數的時候,到了10,就會進一位,做加法運算的時候,到了10,也會向前進一位,這就是進制,前進或進位的制度, 它只是 我們的一種記數法則。到了10就會向前進一位,簡化一下,就是十制,這不就是十進制了,逢十進一的制度,那麽其它的進制就很好說了:
二進,到了2就向前進一位,那也就是逢二進一,就是二進制,它只有0和1;
八進,到了8就向前進一位,逢八進一,就是八進制,只能用0-7 進行表示;
十六進:到了16就進一位,逢十六進一,就是16進制,但是我們平時只有0-9 這些數字,怎麽能表示16,超出的10部分是用字母代替,如A表示的是10, b表示11, 大小寫都可以
進制說完了,但這裏遇到了一個問題,如果寫一個數字21, 它是幾進制,八進制,十進制? 所以還需要在表現形式上進行一下區分,在計算機程序語言中,默認是十進制,也就是說,如果什麽都不表示,這個數就是十進制表示的數,八進制則是加前綴0(這是在java中,在 ES6中則是加前綴0o), 十六進制加前綴0x或0X,如0X21。
這時基本上就明白了,所謂的進制,只不過是一種計數方式,二進制,八進制,十進制,十六進制等,只不過是一個數的不同的表現形式。舉個簡單的例子,就是上面的21好了,用二進制表示21是10101, 8進制表示則是025, 16進制則是0x15.
為什麽會出現二進制,這要從早期的計算機說起,計算機在早期的時候存儲的是電信號,電信號就是我們所說的開關。開關,開關,它當然只有兩種狀態,開或關,到後來就演變成了計算機中的0,1,所有的數據都以0,1進行表示。最後,國際標準化組織決定以8個二進制位為一組來表示數據,這就是所說的字節byte,字節成為了表示數據的最小單元。一個字節由8個二進制位組成,一個二進制位為一個bit 位。 最小單元表示,無論數據有多小,我都用一個字節來表示,比如寫一個0, 它完全可以用一個二進制位bit來表示,但不行,由於最小單元的存在,還是用8個二進制位表示,它在內存在占一個字節。 可以用記事本驗證一下,在桌面上新建一個txt文件,右鍵單擊,選屬性,可以看到它的大小是0個字節;這時打開記事本,輸入一個0,保存並關閉,再右鍵屬性,可以看到它的大小是1個字節。
我們發現在計算機中用二進制來表示一個數,非常長,因為8個二進制為一組。如上面的21, 最為正確的表示方式為 00010101, 這非常的不方便,所以後面的人決定以3位為一組進行表示,所以就出現了八進制。上面的8個二進制位可以表示為 000 010 101,當然前面補了一個0, 後面3位101 表示8進制的5, 前面的010 表示8進制中的2,所以八進制表示為025, 後面還有人說三位也有點長,那就四個為一組進行劃分0001 0101, 這就是所謂的十六進制,後面的0010在十六進制表示5,前面的0001 表示1, 所以16進制為0x15.
那麽為什麽三位為一組就是8進制,四位為一組就是16進制呢? 這還是要從它們的定義說起,八進制,逢八進一。我們來看一下三個二進制位表示的最大數和最小數就知道了,3個二進制位最小數為000, 肯定是0, 最大數111, 它是7, 所以三個二進制位表示的數字範圍為0~7,很顯然,如果再加1個二進制位,它就要向前進1了,逢八進一,八進制。同理,四個二進制位的最小值 為0000,它是0,最大值為1111,為f,也就是15, 再大一位,就變成了16,它要向前進1了,逢十六進一,所以是十六進制。
計算機中的進制