數位電路/表示
必須區分“數量”和“數字”。數量僅僅是某種“東西”的多少;五個蘋果、三磅和一輛汽車都是不同事物的數量。數量可以用許多不同的表示方式來表示。例如,紙上的刻度線、繩子上的珠子或口袋裡的石頭都可以表示某種東西的數量。最常見的表示方式之一是十進位制(或“基數-10”)數字,它由 10 位數字組成,從 0 到 9。當需要計算超過 9 個物體時,我們會在其中建立一個新的列,並在其中寫 1(表示 10 個組),然後繼續從那裡計數。
然而,計算機不能以十進位制方式計數。計算機硬體使用一種系統,其中值在內部以一系列電壓差來表示。例如,在大多數計算機中,+5V 電荷表示為“1”位,而 0V 值表示為“0”位。不可能有其他位!因此,計算機必須使用一個只有兩位數字(0 和 1)的編號系統:“二進位制”或“基數-2”編號系統。
最初,許多學生難以理解二進位制數系統。從十進位制數開始可能會有所幫助,因為十進位制數更熟悉。可以使用“展開表示法”來寫像 1234 這樣的數字,以便顯示每個位置的值。
注意,每個數字都乘以 10 的連續冪,因為這是一個十進位制數或基數-10 系統。“個位”數字(示例中的“4”)乘以,或“1”。“個位”數字左側的每個數字都乘以 10 的下一個更高冪,並將該結果加到前一個值。
現在,對二進位制數做同樣的事情;但由於這是一個“基數-2”的數字,所以用 2 的冪替換 10 的冪。
下標表示基數。請注意,在以上等式中
二進位制數與它們等效的十進位制數相同,只是表示給定數量的不同方式。簡單地說,您有 還是 個蘋果,您仍然可以做餡餅。
術語位是二進位制數位的縮寫。每一位都是一個二進位制值:1 或 0。計算機通常將 1 表示為正電壓(5 伏或 3.3 伏是常見值),並將 0 表示為 0 伏。
在十進位制數 48723 中,“4” 位代表 10 的最大冪(或 ),而數字 3 代表 10 的最小冪 ()。因此,在這個數字中,4 是最高有效位,而 3 是最低有效位。考慮一個婚宴上,一位承辦商需要準備 156 餐。如果承辦商在最低有效位犯錯,不小心做成了 157 餐,這不是什麼大問題。但是,如果承辦商在最高有效位 1 上犯錯,做了 256 餐,那可就是大問題了!
現在,考慮一個二進位制數:101011。最高有效位 (MSB) 是最左邊的位,因為它代表 2 的最大冪 ()。最低有效位 (LSB) 是最右邊的位,代表 2 的最小冪 ()。
請注意,MSB 和 LSB 與其他科學領域使用的“有效數字”概念不同。十進位制數 123000 只有 3 位有效數字,但最高有效位是 1(最左邊的數字),最低有效位是 0(最右邊的數字)。
標準大小
[edit | edit source]| 名稱 | 長度/位 |
|---|---|
| 位 | 1 |
| 位元組 | 4 |
| 位元組 | 8 |
| 字 | 16 |
| 雙字 | 32 |
| 四字 | 64 |
| 機器字 | 取決於 |
- 位元組
- 一個位元組是 4 位長。位元組可以儲存從 0 到 15(十進位制)的值。
- 位元組
- 一個位元組是 8 位長。位元組可以儲存從 0 到 255(十進位制)的值。
- 字
- 一個字是 16 位,或 2 個位元組長。字可以儲存從 0 到 65535(十進位制)的值。偶爾會混淆這個定義和“機器字”的定義。請參見下面的機器字。
- 雙字
- 一個雙字是 2 個字長,或 4 個位元組長。它們也稱為“雙字”。雙字也稱為 32 位長。因此,32 位計算機操作的是雙字大小的資料。
- 四字
- 一個四字是 2 個雙字長,4 個字長,8 個位元組長。它們也稱為“四字”。四字是 64 位長,因此是 64 位計算機中的預設資料大小。
- 機器字
- 機器字是給定機器的標準資料大小的長度。例如,32 位計算機有一個 32 位機器字。同樣,64 位計算機有一個 64 位機器字。有時“機器字”一詞會簡稱為“字”,導致人們不清楚我們指的是常規“字”還是機器字。
負數
[edit | edit source]似乎在二進位制中建立負數,讀者只需要在數字前面加上“–”號就可以了。例如,二進位制數 1101 可以簡單地寫成“–1101”來變成負數。這看起來一切都好,直到你意識到計算機和數位電路不理解減號。數位電路只有位,因此必須使用位來區分正數和負數。考慮到這一點,有許多不同的方案用於使二進位制數變為負數或正數:符號位和幅度、反碼和補碼。
符號位和幅度
[edit | edit source]在符號位和幅度方案中,給定二進位制數的 MSB 用作“標誌”,用於確定該數是正數還是負數。如果 MSB = 0,則該數為正數,如果 MSB = 1,則該數為負數。這種方案看起來非常簡單,除了一個簡單的事實:在這種方案下,數字的運算非常困難。假設我們有 2 個位元組:1001 和 0111。在符號位和幅度下,我們可以將它們翻譯成:-001 和 +111。那麼,在十進位制中,這些數字分別是 –1 和 +7。
當我們將它們加在一起時,–1 + 7 = 6 的和應該是我們得到的值。但是
001 +111 ---- 000
這不對。我們需要的是一個決策結構,來確定 MSB 是否被設定,如果被設定,則減去,如果沒有被設定,則加上。這很麻煩,因此符號位和幅度沒有被使用。
反碼
[edit | edit source]現在讓我們檢查一下一種方案,其中我們將負數定義為正數的邏輯反轉。我們將使用相同的“!”運算子來表示對多個位的邏輯反轉。例如,!001100 = 110011。110011 是 51 的二進位制表示,而 001100 是 12 的二進位制表示。但在這種情況下,我們說 001100 = –110011,或者 110011(二進位制)= -12 十進位制。讓我們再次執行加法
001100 (12) +110011 (-12) ------- 111111
我們可以看到,如果我們反轉 0000002,我們得到的值是 1111112。因此,1111112 是負零!負零到底是什麼?事實證明,在這種方案中,正零和負零是相同的。
然而,反碼錶示法存在問題,因為它對零有兩種表示:全 0 位或全 1 位。除了笨拙之外,這還會在我們要快速檢查一個數是否為零時造成問題。這是一個非常常見的操作,我們希望它很簡單,因此我們建立了一種新的表示方法,補碼。
補碼
[edit | edit source]補碼是一種數字表示法,它與反碼非常相似。我們使用以下公式找到數 X 的負數
-X = !X + 1
讓我們舉個例子。如果我們有二進位制數 11001(十進位制為 25),我們想找到 -25 的補碼錶示,我們遵循兩個步驟
- 反轉數字
- 11001 → 00110
- 加 1
- 00110 + 1 = 00111
因此,–11001 = 00111。讓我們做一個小加法
11001 +00111 ------ 00000
現在,將兩個 MSB 加在一起會產生進位,但這畢竟是數字邏輯,所以我們丟棄進位。重要的是要記住,數位電路的位數是有限的,任何額外的位都會被丟棄。
大多數現代計算機使用補碼。
下圖顯示了這些系統對所有 4 位組合的表示

帶符號的 vs 無符號的
[edit | edit source]要記住的一件重要的事情是,計算機是愚蠢的。計算機不知道一組給定的位表示的是帶符號數還是無符號數(或者,就此而言,還有其他資料物件)。因此,程式設計師(或程式設計師信賴的編譯器)必須為我們跟蹤這些資料。考慮位模式 100110
- 無符號:38(十進位制)
- 符號位和幅度:-6
- 反碼:-25
- 補碼:-26
看看我們使用的表示方式如何改變數字的值!重要的是要理解,位就是位,計算機不知道位代表什麼。電路設計者和程式設計師負責跟蹤數字的含義。
我們已經瞭解了二進位制數如何表示無符號值以及如何使用各種方案表示負數。但是現在我們必須問自己,二進位制數如何表示其他形式的資料,比如文字字元?答案是存在將二進位制資料轉換為字元的不同方案。每個方案都像一個對映,將特定的位模式轉換為特定的字元。有三種流行的方案:ASCII、UNICODE 和 EBCDIC。
ASCII 程式碼(美國資訊交換標準程式碼)是將位對映到字元的最常見程式碼。ASCII 僅使用 7 位,但由於計算機一次只能處理 8 位位元組,因此 ASCII 字元的第 8 位(MSB)未用。ASCII 程式碼 0-31 是“控制程式碼”,這些程式碼是不能列印到螢幕上的字元,計算機使用它們來處理某些操作。程式碼 32 是一個空格(按空格鍵)。字元 '1' 的字元程式碼是 49,'2' 是 50,等等... 注意在 ASCII 中 '2' = '1' + 1(字元 1 加上整數 1)。這對許多人來說一開始很難理解,所以如果你感到困惑,不要擔心。
大寫字母從 'A' = 65 到 'Z' = 90 開始。小寫字母從 'a' = 97 到 'z' = 122 開始。
幾乎所有其他 ASCII 程式碼都是不同的標點符號。
由於計算機使用位元組大小的資料,因此讓 ASCII 只包含 7 位資料(最多 128 個字元程式碼)沒有意義。因此,許多公司將額外的位合併到“擴充套件 ASCII”程式碼集中。這些擴充套件集最多可以使用 256 個字元。前 128 個字元是原始 ASCII 字元,但接下來的 128 個字元是平臺定義的。每個計算機制造商都可以定義自己的字元來填充最後 128 個位置。
當計算機開始在世界各地普及時,計算機開始使用其他語言。很快,每個國家都有自己的字元程式碼集來表示自己的字母。重要的是要記住,世界上有些字母表有超過 256 個字元!因此,提出了 UNICODE 標準。UNICODE 有許多不同的表示形式。其中一些使用 2 位元組字元,而另一些使用不同的表示形式。UNICODE 集的前 128 個字元是原始 ASCII 字元。
有關 UNICODE 的更深入討論,請參見 此網站。
EBCDIC(擴充套件二進位制編碼十進位制交換碼)是最初由 IBM 提出的字元程式碼,但後來被 ASCII 代替。然而,IBM 仍然在其一些超級計算機、大型機和伺服器系統中使用 EBCDIC。
八進位制與十進位制和二進位制類似,一旦一列“滿”,就會移到下一列。它使用數字 0−7 作為數字,並且由於有可用的二進位制倍數(8=23)的數字,它有一個有用的特性,即在八進位制和二進位制數之間進行轉換很容易。考慮二進位制數:101110000。要將此數字轉換為八進位制,我們首先必須將其分成 3 位一組:101、110、000。然後我們只需將每一位的值加起來
然後我們將所有八進位制數字串在一起
- 1011100002 = 5608.
十六進位制是一種非常常見的數資料表示方式。它比八進位制更常見,因為它每個數字代表四個二進位制數字,並且許多數位電路使用 4 的倍數作為其資料寬度。
十六進位制使用 16 為基數。但是,存在一個困難,因為它需要 16 位數字,而常見的十進位制數系統只有十位數字可以使用(0 到 9)。因此,為了擁有足夠的數字可以使用,我們使用字母 A 到 F,以及數字 0-9。單位列滿後,我們將移到“16 位”列,就像二進位制和十進位制一樣。
| 十六進位制 | 十進位制 | 八進位制 | 二進位制 |
|---|---|---|---|
| 0 | 0 | 0 | 0000 |
| 1 | 1 | 1 | 0001 |
| 2 | 2 | 2 | 0010 |
| 3 | 3 | 3 | 0011 |
| 4 | 4 | 4 | 0100 |
| 5 | 5 | 5 | 0101 |
| 6 | 6 | 6 | 0110 |
| 7 | 7 | 7 | 0111 |
| 8 | 8 | 10 | 1000 |
| 9 | 9 | 11 | 1001 |
| A | 10 | 12 | 1010 |
| B | 11 | 13 | 1011 |
| C | 12 | 14 | 1100 |
| D | 13 | 15 | 1101 |
| E | 14 | 16 | 1110 |
| F | 15 | 17 | 1111 |
根據您正在閱讀的原始碼,十六進位制可能會用以下幾種方式之一表示
- 0xaa11: ANSI C 符號。字首0x指示剩餘的數字將被解釋為十六進位制。例如,0x1000,等於十進位制的 4096。
- \xaa11: “C 字串”符號。
- 0aa11h: 典型的組合語言符號,由h字尾指示。前導0(零)確保彙編器不會錯誤地將數字解釋為標籤或符號。
- $aa11: 另一種常見的組合語言符號,廣泛用於 6502/65816 組合語言程式設計。
- #AA11: BASIC 符號。
- $aa11$: 商業 BASIC 符號。
- aa1116: 數學符號,下標表示數字基數。
- 16#AA11#: VHDL 符號,用於表示數字。
- x"AA11": VHDL 表示一個 16 位位的陣列。
- 16'hAA11: Verilog 表示法,其中“16”是總位數。
可以使用大寫和小寫字母。在 Linux、UNIX 或 C 環境中通常首選小寫字母,而在大型機或 COBOL 環境中通常首選大寫字母。