附錄一 數字系統


進位法

自人類開始計算數字以來,發明了許多記錄數字的方法,最直接的方法就是一條線代表一,兩條線現代表二……,但是總不能以十個線條表示十,以一百個線條表示一百 ( 事實上,有些地區的人,一開始只能計算到三,三以上就被認為很多,人類計數,也是一部經歷數萬年的歷史 )。有許多民族想出了解決之道,羅馬人是其中之一,他們用一個符號代表五,另一個符號代表十,

I     表示一        X  表示十          M  表示一千
II    表示二        L  表示五十        V  表示五千
III   表示三        C  表示一百
V     表示五        D  表示五百

現在有些時鐘鐘面上,仍用羅馬數字表示。這種方式雖然是很大的進步,但要表示百、千、萬就麻煩了。( 註二:羅馬數字)

我們現在用的數字系統是印度人發明的(有一說是阿拉伯人)和一般表示數字的方法有兩點不同,一是零的發明,一是用位置表示位數。它用 1 代表一、2 代表二,一直到了九變成十的時候就發生進位,這時用 1 表示十位數,後面用 0 表示個位數,表示空位或沒有的意思,於是就變成了 10 表示十。因此數字所在的位置不同,代表的意義就不同,小學生都知道 100 這個數有兩個 0,但這兩個零是不一樣的。零的發明,在計數上有很重要的意義。


二進位和十進位

或許你會問,為什麼到十才發生進位,不在其他數字發生進位呢?人類採用十進位計數,並沒有什麼特殊的理由,這完全是因為人類有十個手指頭,你知道嗎?有些地方因為連腳指頭也用來計數,所以是二十進位。如果有外星人有 8 個手指頭,說不定他們就是用八進位。而電腦只有兩個「手指頭」,記憶體中的電壓如果是高電壓代表一,低電壓代表零,或者我們說高電壓代表一、低電壓代表零,所以電腦用「二進位」。如果有兩個記憶體,就有四種表示方法,分別代表 0、1、2、3:
00    表示 0
01    表示 1
10    表示 2
11    表示 3

如果有三個記憶體,就有八種表示方法,代表 0 到 7:

000    表示 0
001    表示 1
010    表示 2
011    表示 3
100    表示 4
101    表示 5
110    表示 6
111    表示 7

你可以看得出來,如果每加入一個記憶體,可以計數的個數就變成原來的兩倍。在電腦中用八個記憶體(也就是八位元)表示 0 到 255 共有 256 個數字。

0000 0000    表示 0
0000 0001    表示 1
0000 0010    表示 2
0000 0011    表示 3
0000 0100    表示 4
……
1111 1111    表示 255

事實上,上面這些例子的左邊一大堆的 0 和 1 就是所謂的二進位數,也就是電腦看得懂的數,右邊就是我們所熟知的十進位數。那二進位和十進位之間要怎麼轉換呢?

二進位數變成十進位數,只要記得 2 的冪方就可以了。也就是說 20=1、21=2、22=4、23=8 ……,計算方式如下,最右邊的那一位數若為一,表示加一,若為零表示不加;右邊第二位數若為一表示加 2,若為零表示不加;右邊第三位數若為一表示加 4,若零表示不加,依此類推,最後再總加起來就可以了。舉例來說,下圖

二進位 1010 1011 相當於十進位的 171(128+32+8+2+1=171)。註一

而十進位變成二進位就用連續減去 2 的冪方數即可。舉例來說,把 171 變成二進位數方法如下:

171 - 128 = 43  128 的那一位數有
43 -  64        不夠減了,所以 64 那一位為
43 -  32 = 11   32 的那一位數為
11 -  16        不夠減了,所以 16 那一位為
11 -   8 = 3    8 的那一位數為
3 -   4         不夠減了,所以 4 那一位為
3 -   2 = 1     2 的那一位數為
1               最後還剩下一,所以最右邊那一位數為
最後綜合上式,由上而下得到 1010 1011,就是 171 的二進位數。

十六進位和十進位

在組合語言中,如果用二進位表示數字,那就有一大串的 0 和 1,只要有一點點疏忽,就很容易出錯,所以又有十六進位代替二進位較為方便。十六進位的一到九就是阿拉伯數字的 1 到 9,但是十以英文字的 A 表示,十一用 B 表示,…十五用 F 表示,就像下面的表一樣:

表一:十六進位與二進位
十進位 二進位 十六進位 十進位 二進位 十六進位
000000810008
100011910019
200102101010A
300113111011B
401004121100C
501015131101D
601106141110E
701117151111F

超過十六進位的 F 時,就發生進位了,這時就變成 10H,也就是 16D;11H 就是 17D。

在組合語言中為了區分這些數字系統,在數字後加上 H 表示十六進位數,加上 D 表示十進位數,加上 O 表示八進位數,加上 B 表示二進位數。此外如果是十六進位而且第一位是英文字母,要在最前面加上阿拉伯數字的 0,才不會使編譯器誤認為是變數名稱,例如表示十六進位的 A12,要用 0A12h,英文字母用大寫或小寫都是一樣的。

再仔細看看,一位的十六進位數剛好可以用四位元表示,也就是說,一位十六進位數必需用四位二進位數表示,換句話說二進位和十六進位之間的轉換就是用這個關係,稍候再說明。

十六進位和十進位數之間的轉換是最常用的,先說說如何將十六進位變成十進位。在說明如何變換前,先回想小學時假如有一個十進位數 1399,它的數值大小是不是等於 1x103+3x102+9x101+9 呢?這是因為是十進位,所以乘以 10 的冪方數﹔同理如果是十六進位就乘以 16 的冪方數,另外要注意,A 要等於 10d、B 等於 11d 等等。舉例來說,現在想把 2AC1 這個十六進位數變成十進位數,

2AC1H = 2x163+10x162+12x161+1
      = 2x4096+10x256+12x16+1
      = 8192+2560+192+1
      = 10945

十進位變十六進位可以用連續減法,或者用除法(事實上除法就是連續減法的結果),在此我用除法說明好了,連續減法可以參考上面十進位變二進位的方法。例如現在我把 10945D 變成十六進位,於是先除以 16(為什麼除以 16?想想看)得到餘數就是十六進位的個位數,其商再除 16 ……。例如將 11523 換成十六進位數,步驟如下:

11523 ÷16 =720 .....  3 → 餘數為十六進位的個位數
  720 ÷16 = 45 .....  0 → 餘數為十六進位的十位數
   45 ÷16 =  2 ..... 13 → 餘數 13 (即十六進位 0DH)為十六進位的百位數
    2 ÷16 =  0 .....  2 → 餘數為十六進位的千位數
所以 11523d=2D03h 。

十六進位和二進位

好了,現在如果你已經會二進位數,並且瞭解前面所提過的十六進位和二進位換算表(即表一)就很容易了。舉例來說,有一個二進位數 110101101101000101 要變成十六進位,就將他由最低位數開始每四個位元一組變成 0011 0101 1011 0100 0101,然後
0011 變成 3
0101 變成 5
1011 變成 B
0100 變成 4
0101 變成 5
得到 35B45H。同理如果是十六進位變成二進位就將上述步驟反方向運算即可。

以上的說明雖然簡單,但是如果要寫成程式,仍有一段距離,請參考第四章到第八章。


註一: 記得小學老師說:「十進位數 256 也可以看成 2x102+5x101+6x100 。」嗎?這裡也是如此,連十六進位變成十進位、二進位變十進位也是用同樣的原理。

註二:

羅馬數字用加法和減法的概念來簡化計數方式。不過在說明如何用羅馬數字表示之前,得先介紹羅馬數字常見的符號:

 I   表示一
 V   表示五    
 X   表示十          
 L   表示五十
 C   表示一百
 D   表示五百
 M   表示一千
    表示五千
    表示一萬

在書寫羅馬數字時,必須由左邊向右邊書寫,所以二用『II』表示,代表 1+1,三用『III』表示,代表 1+1+1,這兩個數字,用的是加法的觀念。但是四卻用『IV』表示,代表 5-1 ,在羅馬數字中為了簡化書寫,如果一個較小數寫在較大數左邊,則表示相減;反過來說,相同的數寫在一起或小數寫在大數右邊,則表示相加。像前面所說的『II』和『III』,還有六也是用『VI』,它們都表示加法的概念。

我想把 1 到 100 的羅馬數字表示方法列成一張表,就很清楚了。

阿拉伯數字羅馬數字 阿拉伯數字羅馬數字 阿拉伯數字羅馬數字 阿拉伯數字羅馬數字
1I 26XXVI 51LI 76LXXVI
2II 27XXVII 52LII 77LXXVII
3III 28XXVIII 53LIII 78LXXVIII
4IV 29XXIX 54LIV 79LXXIX
5V 30XXX 55LV 80LXXX
6VI 31XXXI 56LVI 81LXXXI
7VII 32XXXII 57LVII 82LXXXII
8VIII 33XXXIII 58LVIII 83LXXXIII
9IX 34XXXIV 59LIX 84LXXXIV
10X 35XXXV 60LX 85LXXXV
11XI 36XXXVI 61LXI 86LXXXVI
12XII 37XXXVII 62LXII 87LXXXVII
13XIII 38XXXVIII 63LXIII 88LXXXVIII
14XIV 39XXXIX 64LXIV 89LXXXIX
15XV 40XL 65LXV 90XC
16XVI 41XLI 66LXVI 91XCI
17XVII 42XLII 67LVII 92XCII
18XVIII 43XLIII 68LXVIII 93XCIII
19XIX 44XLIV 69LXIX 94XCIV
20XX 45XLV 70LXX 95XCV
21XXI 46XLVI 71LXXI 96XCVI
22 47XLVII 72LXXII 97XCVII
23XXIII 48XLVIII 73LXXIII 98XCVIII
24XXIV 49XLIX 74LXXIV 99XCIX
25XXV 50L 75LXXV 100C

其中有兩處是比較特別的,一是『49』,另一處是『99』,它們不是分別用『IL』和『IC』表示。49 應該先寫代表『40』的『XL』,再寫代表『9』的『IX』,所以『49』應該用『XLIX』表示。同理『99』應該用『XCIX』表示。