原始碼、反碼和補碼

Chengkai730發表於2024-08-31

對於有符號數而言,原碼就是一個數的二進位制表示。二進位制的最高位是符號位,0 表示正數,1 表示負數。比如 56 是十進位制,轉為二進位制就是 00111000,於是 56 的原碼就是 00111000,左邊第一位 0 是符號位,後面的其他數字是資料位。

計算機用數的原碼進行顯示,數的計算和儲存是用補碼進行的。

用原碼對正數進行計算是不會有什麼問題的。

正數的原碼,反碼和補碼都一樣,即正數三碼合一。

負數的原碼就是絕對值的原碼的最高位的 0 改為 1。比如 56 是十進位制,轉為二進位制就是 00111000,於是 56 的原碼就是 00111000,於是 -56 的原碼就是 10111000。

負數的反碼的計算方式:原碼的符號位不變,其他位取反,即 1 變成 0,0 變成 1。

負數的補碼的計算方式:反碼加 1。因此負數的反碼等於補碼減 1。即:

負數的補碼 = 反碼 + 1

負數的反碼 = 補碼 - 1

0 的反碼和補碼都是 0。

一個位元組是 8 位,即 8 個 bit。一個位元組的數字,最大是 01111111,轉為十進位制為 127。最小值為 11111111,轉為十進位制為 -127。

反碼是為了解決原碼不能計算負數的問題而出現的。負數計算的時候,如果結果不跨 0,是沒有任何問題的,但是如果結果跨 0,則計算結果和實際結果有 1 的偏差。

補碼是為了解決反碼在負數計算時跨 0 的問題而出現的。補碼還能多記錄一個特殊的值,即 -128。-128 在一位元組下沒有原碼和反碼。

一般都是先根據一個數寫出它的二進位制表示,即得到原碼,然後從原碼得到反碼,再從反碼得到補碼。最後用補碼進行計算,計算結果是補碼,再將這個結果轉化為反碼,再將反碼轉化為原碼,最後輸出原碼。即:

一個數 → 原碼 (二進位制表示) → 反碼 → 補碼 → 進行計算 → 補碼 → 反碼 → 原碼

計算得到補碼時,如果補碼的最高位為 0,說明是正數,則反碼和原碼也都和補碼相等(三碼合一)。

-128 沒有原碼和反碼,只有補碼。

相關文章