C語言二進制、八進制、十六進制詳解

什麼是二制制?

在數學計算中,二進制計數系統的公分母是最小的,它以2爲基數。你還記得在小學或中學時所學的不同的計數系統嗎?筆者在上小學時,曾在一堂數學課中學過以6爲基數的計數系統;你先數1,2,3,4,5,然後是10,11,12,13,14,15,然後是20,等等,實際上,應該先數0,1,2,3,4,5,然後是10,1l,12,13,14,15,等等。從O開始數,能比較清楚地看出每6個數字組成一組——因此6就是基數。注意,你應該從O開始一起數到比基數小1的數(因爲基數是6,所以你應該從O數到5)。當你數到5後,接着應該開始數兩位數。如果你思考一下,你就會發現這與以10爲基數(十進制)的計數系統是類似的——在你數到比基數小1的數(9)後,就轉到兩位數,並繼續往下數。

計算機中的計數系統以2爲基數——即二進制。由於以2爲基數,所以你先數O,1,然後是10,11,然後是100,101,110,111,然後是1000,1001,1010,1011,1100,1101,1110,1111,等等。與以6爲基數時不同,在以2爲基數時,在數到兩位數之前,只需從O數到1。

那麼,爲什麼在計算機中要以2爲基數呢?其原因在於計算機中使用了晶體管。晶體管使現代計算機的出現成爲可能。晶體管就象電燈開關,電燈開關有“開”和“關”兩種狀態,晶體管也是如此。你可以認爲“關”表示0,“開”表示1,這樣,你就可以用一個晶體管(如果你願意,也可以用一個電燈開關)來進行從。到1的計數了。僅僅使用兩個數字(O到1)還不能做任何複雜的計算,但是我們還可以繼續下去。假設有一個電燈開關控制面板,上面有4個大電燈開關,儘管每個開關只有兩種狀態,但是這些開關組合起來就會有16或2。(4個開關,每個2種狀態)種不同的狀態。這樣,你就可以用4個開關來進行從。到15的計數了,見表20.22。

  表20.22  進制計數
-------------------------------------------------------
      開關         十進制值            冪
-------------------------------------------------------
       O             O
       1             1                 20
      10             2                 21
      11             3
     100             4                 22
     101             5
     110             6
     111             7
    1000             8                 23
    1001             9
    1010            10
    1011            11
    1100            12
    1101            13
    1110            14
    1111            15
-------------------------------------------------------
上表說明了很重要的三點:
通過把開關並排放在一起,你就可以用它們來計數了——在本例中最多可以數到15(總共16次計數);
你可以把每個開關看作是一個二進制位,就象十進制系統中的十進制位一樣;
如果每個開關都代表一個二進制位,那麼它們剛好也都代表一個2的冪(20,21,22,23,等等)。

此外,請注意,在表中出現2的冪的地方,計數結果就要增加一個二進制位。這與十進制系統是相同的,每增加一個十進制位時,這個新的十進制位也正是一個10的冪(1=100,10=101,100=102,等等)。明白了這一點後,你就可以很容易地把二進制數轉換爲十進制數了,例如,二進制數10111就是(1×24)+(O×23)+(1×22)+(1×21)+(1×20),它等於十進制的(16+0+4+2+1)或23。10 1110 1011,一個大得多的二進制數,就是(1×29)+(O×28)+(1×27)+(1×26)+(1×25)+(0×24)+(1×23)+(O×22)+(1×21)+(1×20),它等於十進制的(512+0+128+64+32+0+8+0+2+1)或747。

那麼所有這些和我們有什麼關係呢?在計算機領域中,存在着位(bit),半字節(nibble)和字節(byte)。一個半字節是4位,一個字節是8位。什麼是一個位呢?它就是一個晶體管。因此,一個字節就是8個相鄰的晶體管,就象表20.1中的4個開關一樣。記住,如果你有4個組合在一起的開關(或晶體管),你就可以數24或16,你可以把這看作是由開關組成的一個半字節。如果一個半字節是4個晶體管組合在一起,那麼一個字節就是8個晶體管組合在一起。你可以用8個晶體管數到2。或256,從另一個角度看,這意味着一個字節(含8個晶體管)可以表示256個不同的數字(從0到 255)。再深入一點,Intel 386,486和Pentium處理器被叫做32位處理器,這意味着這些Intel芯片所進行的每一次運算都是32位寬或32個晶體管寬的。32個晶體管,或32位,等價於232或4,294,967,296,即它們能表示超過40億個不同的數字。

當然,上述介紹還不能解釋計算機是如何利用這些數字產生那種神奇的計算能力的,但它至少解釋了計算機爲什麼要使用以及是如何使用二進制計數系統的。

什麼是八進制?

八進制是以8爲基數的一種計數系統。在八進制系統中,你是這樣計數的:O,1,2,3,4,5,6,7,10,ll,12,13,等等。下面比較了八進制(第二行)和十進制(第一行)中的計數過程:
    O,l,2,3,4,5,6,7,8,9,10.11,12,13,14,15,16
    0,1,2.3,4,5,6,7,10,11,12,13,14,15,16,17,20
注意,在八進制中,在數到7後,就要增加一個八進制位,第二個八進制位顯然就是8?(等於十進制的8)。如果你數到第三個八進制位(八進制的100),那將是8?或十進制的64,因此,八進制的100等於十進制的64。

現在,八進制已經不象以前那樣常用了,這主要是因爲現在的計算機使用的是8,16,32或64位處理器,最適合它們的計數系統是二進制或十六進制(見20.24中有關十六進制計數系統的介紹)

C語言支持八進制字符集,這種字符要用反斜槓字符來標識。例如,在C程序中,下面的語句並不少見:
    if(x=='\007')break;
這裏的"\007"恰好就是ASCII值爲7的字符;該語句用來檢查終端鳴笛字符。另一個常見的八進制數是"\033",即Escape字符(在程序中它通常表示爲"\033")。然而,八進制數現在已經很少見了——它們被十六進制數代替了。

什麼是十六進制?

十六進制(hexadecimal,縮寫爲hex)是以16爲基數的計數系統,它是計算機中最常用的計數系統。十六進制中的計數過程爲:O,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F,10,11,12,13,14,15,16,17,18,19,1A,1B,1C,1D,1E,1F,等等。十六進制中的字母是幾個單位數標識符,表示十進制的10到15。要記住在不同基數下的計數規則,即從O數到比基數小1的數字,在十六進制中這個數就是十進制的15。因爲西式數字中沒有表示大於9的單位數,所以就用A,B,c,D,E和F來表示十進制的10到15。在十六進制中,數到F之後,就要轉到兩位數上,也就是1OH或Ox1O。下面對十六進制(第二行)和十進制(第一行)的計數過程作一下比較:
    1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,……
    1,2,3,4,5,6,7,8,9,A, B, C, D, E, F, 10,……
 
注意,十進制的10等於十六進制的A。與前面討論過的計數系統一樣,每增加一個十六進制位,實際上就增加了一個16的冪,即160(1),161(16),162(256),163(4096),等等。因此,十六進制數3F可以展開爲(3×161)+(F×160),等於十進制的(48+15)或63;十六進制數13F可以展開爲(1×162)+(3×161)+(F×160),等於十進制的(256+48+15)或319。在c程序中,這兩個數用0x3F或Oxl3F這樣的形式來表示,其中的“0x”前綴用來告訴編譯程序(和程序員)該數字應被當作十六進制數來處理。如果不加“0x”前綴,你就無法判斷一個數究竟是十六進制數還是十進制數(或者是八進制數)。

對錶20.22稍作改進,加入十六進制的計數過程,就得到了表20.24:
—————————————————————————————————
  二進制    十進制值    二進制冪    十六進制    十六進制冪
—————————————————————————————————
  0000        O                       O
  0001        1    20                 1            160
  0010        2    21                 2
  0011        3                       3
  0100        4    22                 4
  0101        5                       5
  0110        6                       6
  0111        7                       7
  1000        8    23                 8
  1001        9                       9
  1010        10                      A
  1011        11                      B
  1100        12                      C
  1101        13                      D
  1110        14                      E
  1111        15                      F
  10000       16   24                10             161
—————————————————————————————————
筆者在上表的最後又加了一行,使計數達到十進制的16。通過比較二進制、十進制和十六進制·你就會發現:“十”在二進制中是“1010”,在十進制中是“10”,在十六進制中是“A”;。。十六”在二進制中是“1 0000"或“10000”,在十進制中是“16”,在十六進制中是“1O”,,(見上表的最後一行)。這意味着什麼呢?因爲今天的16,32和64位處理器的位寬恰好都是16的倍數,所以在這些類型的計算機中用十六進制作爲計數系統是非常合適的。

十六進制位和二進位之間有一種“倍數”關係。在上表的最後一行中,二進制值被分爲兩部分(1 0000)。4個二進制位(或者4位)可以計數到15(包括O在內共16個不同的數字),而4位(bit)正好等於一個半字節(nibble)。在上表中你還可以發現,一個十六進制位同樣可以計數到15(包括。在內共l 6個不同的數字),因此,一個十六進制位可以代表4個二進制位。一個很好的例子就是用二進制表示十進制的15和16,在二進制中,十進制的15就是1111,正好是4個二進制位能表示的最大數字;在十六進制中,十進制的15就是F,也正好是一個十六進制位能表示的最大數字。十進制的16要用5個二進制位(1 0000)或兩個十六進制位(10)來表示。下面把前文提到過的兩個數字(0x3F和0x13F)轉換爲二進制:
    3F              111111
    l3F          100111111

如果把前面的空格換爲O,並且把二進制位分成4位一組,那麼看起來就會清楚一些:
    3F     0 0011 1111
    l3F    1 0011 1111

你並不一定要把二進制位分成4位一組,只不過當你明白了4個二進制位等價於一個十六進制位後,計數就更容易了。爲了證明上述兩組數字是相等的,可以把二進制值轉換爲十進制值(十六進制值到十進制值的轉換已經在前文中介紹過了);二進制的111111就是(1×25)+(1×24)+(1×23)+(1×22)+(1×21)+(1×20),等於十進制的(32+16+8+4+2+1)或63,與0x3F的轉換結果相同。二進制的1 0011 1111就是(1×28)+(O×27)+(0×26)+(1×25)+(1×24)+(1×23)+(1×22)++(1×21)+(1×20),等於十進制的(256+32+1 6+8+4+2+1)或319。因此,十六進制和二進制能象手掌和手套那樣相互匹配。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章