基礎的資訊表示法,在越高階的程式語言撰寫中,越無法感覺到它的重要性,反正所有變數就一律宣告長整數或雙倍精度浮點數即可,字串都已經有設計好的 API 進行處理,只要知道怎麼用就好。
但越接近硬體層的操作,就要對這些二進制的表示法越熟悉,例如先前我們曾提過的 SIMD 加速指令集,因為要操作暫存器做多位元組的平行處理,因此就要格外注意變數是宣告為幾個位元組的型別,同時也要確認在計算中會不會溢位,另一個特別但又常見的技巧,就是在有符號數及無符號數之間的轉換或運算,這在一些影像處理中,會有特別應用到的地方。
譬如說我們可以用一個位元組來表示無符號的正整數 0 ~ 255,或是有符號的正整數 -128 ~ 127。
這在計算機概論中應該都有學過,但有仔細想過為什麼可以這樣表示嗎?
正數和 0 的二補數就是該數字本身,同時最高位元為 0;負數的最高位元為 1 ,其二補數則是將其對應正數按位元取反向再加上 1,其範例如下:
高 低
0 1 1 1 1 1 1 1 = 127
0 0 0 0 0 0 1 0 = 2
0 0 0 0 0 0 0 1 = 1
0 0 0 0 0 0 0 0 = 0
1 1 1 1 1 1 1 1 = −1
1 1 1 1 1 1 1 0 = −2
1 0 0 0 0 0 0 1 = −127
1 0 0 0 0 0 0 0 = −128
於是乎,當我們用無符號的正整數計算到飽和時,再用有符號的正整數做型別轉換,則 255 會被轉換成 -1;根據類似的特性,在一些加速的應用上就可能看到有符號跟無符號數轉來轉去。
同樣重要地,還有 ASCII 跟 Unicode,常有人在應用字串類別時,被這兩種標準碼的轉換搞的暈頭轉向。
當我們應用電腦來處理數位資料變成一種習慣時,就會理所當然的認為這些資料本來就該是數位表示(離散值),殊不知在自然界中的訊號都是類比訊號(連續值),是人類因應電腦計算的方便性,將類比訊號透過「取樣」及「量化」後,才變成數位訊號。
這個轉換過程可以在數位訊號處理的課程中學習如何進行轉換,而在電子產品中,常見所謂的 ADC 轉換器或是 ADC IC,這都是用來將類比訊號轉換成數位訊號的常用元件。
如文中所說的「數位影像」,要將感光陣列中光強所轉化的電荷量變成數位訊號,就需要高速的ADC 來進行訊號處理。
總之,當我們已經習慣用數位資料來表示的時候,也不要忘記真實世界依然是類比連續的。
本章節重點摘要如下:
電腦易於處理數位資料,且數位系統比類比系統更容易延伸擴充。
在標準的表示法中,A 到 Z 是 65 到 90、a 到 z 是97 到 122、0 到 9 是 48 到 57;其它字符如標點符號就是用別的數值代表。這稱為美國資訊交換標準代碼(American Standard Code for Information Interchange, ASCII)。
數位資訊是用位元 (bit) 表示,這是 binary digit 的縮寫。
十進制的 1867 可以轉換成二進制的 11101001011 → 1867 = 2^10 + 2^9 + 2^8 + 2^6 + 2^3 + 2^1 + 2^0。
程式設計師常會用到「十六進制」,因為二進數太長了,其表示方式如下:
0 0000
1 0001
2 0010
3 0011
4 0100
5 0101
6 0110
7 0111
8 1000
9 1001
A 1010
B 1011
C 1100
D 1101
E 1110
F 1111