在一個位元組裡的,原碼的我已經知道了:最大的是01111111;最小的是11111111。想知道反碼和補碼最大的和最小的現在我們知道了計算機可以有三種編碼方式表示一個數.對於正數因為三種編碼方式的結果都相同:[+1]=[00000001]原=[00000001]反=[00000001]補所以不需要過多解釋.但是對於負數:[-1]=[10000001]原=[11111110]反=[11111111]補可見原碼,反碼和補碼是完全不同的.既然原碼才是被人腦直接識別並用於計算表示方式,為何還會有反碼和補碼呢?首先,因為人腦可以知道第一位是符號位,在計算的時候我們會根據符號位,選擇對真值區域的加減.(真值的概念在本文最開頭).但是對於計算機,加減乘數已經是最基礎的運算,要設計的儘量簡單.計算機辨別"符號位"顯然會讓計算機的基礎電路設計變得十分複雜!於是人們想出了將符號位也參與運算的方法.我們知道,根據運演算法則減去一個正數等於加上一個負數,即:1-1=1+(-1)=0,所以機器可以只有加法而沒有減法,這樣計算機運算的設計就更簡單了.於是人們開始探索將符號位參與運算,並且只保留加法的方法.首先來看原碼:計算十進位制的表示式:1-1=01-1=1+(-1)=[00000001]原+[10000001]原=[10000010]原=-2如果用原碼錶示,讓符號位也參與計算,顯然對於減法來說,結果是不正確的.這也就是為何計算機內部不使用原碼錶示一個數.為了解決原碼做減法的問題,出現了反碼:計算十進位制的表示式:1-1=01-1=1+(-1)=[00000001]原+[10000001]原=[00000001]反+[11111110]反=[11111111]反=[10000000]原=-0發現用反碼計算減法,結果的真值部分是正確的.而唯一的問題其實就出現在"0"這個特殊的數值上.雖然人們理解上+0和-0是一樣的,但是0帶符號是沒有任何意義的.而且會有[00000000]原和[10000000]原兩個編碼表示0.於是補碼的出現,解決了0的符號以及兩個編碼的問題:1-1=1+(-1)=[00000001]原+[10000001]原=[00000001]補+[11111111]補=[00000000]補=[00000000]原這樣0用[00000000]表示,而以前出現問題的-0則不存在了.而且可以用[10000000]表示-128:(-1)+(-127)=[10000001]原+[11111111]原=[11111111]補+[10000001]補=[10000000]補-1-127的結果應該是-128,在用補碼運算的結果中,[10000000]補就是-128.但是注意因為實際上是使用以前的-0的補碼來表示-128,所以-128並沒有原碼和反碼錶示.(對-128的補碼錶示[10000000]補算出來的原碼是[00000000]原,這是不正確的)使用補碼,不僅僅修復了0的符號以及存在兩個編碼的問題,而且還能夠多表示一個最低數.這就是為什麼8位二進位制,使用原碼或反碼錶示的範圍為[-127,+127],而使用補碼錶示的範圍為[-128,127].因為機器使用補碼,所以對於程式設計中常用到的32位int型別,可以表示範圍是:[-231,231-1]因為第一位表示的是符號位.而使用補碼錶示時又可以多儲存一個最小值.
在一個位元組裡的,原碼的我已經知道了:最大的是01111111;最小的是11111111。想知道反碼和補碼最大的和最小的現在我們知道了計算機可以有三種編碼方式表示一個數.對於正數因為三種編碼方式的結果都相同:[+1]=[00000001]原=[00000001]反=[00000001]補所以不需要過多解釋.但是對於負數:[-1]=[10000001]原=[11111110]反=[11111111]補可見原碼,反碼和補碼是完全不同的.既然原碼才是被人腦直接識別並用於計算表示方式,為何還會有反碼和補碼呢?首先,因為人腦可以知道第一位是符號位,在計算的時候我們會根據符號位,選擇對真值區域的加減.(真值的概念在本文最開頭).但是對於計算機,加減乘數已經是最基礎的運算,要設計的儘量簡單.計算機辨別"符號位"顯然會讓計算機的基礎電路設計變得十分複雜!於是人們想出了將符號位也參與運算的方法.我們知道,根據運演算法則減去一個正數等於加上一個負數,即:1-1=1+(-1)=0,所以機器可以只有加法而沒有減法,這樣計算機運算的設計就更簡單了.於是人們開始探索將符號位參與運算,並且只保留加法的方法.首先來看原碼:計算十進位制的表示式:1-1=01-1=1+(-1)=[00000001]原+[10000001]原=[10000010]原=-2如果用原碼錶示,讓符號位也參與計算,顯然對於減法來說,結果是不正確的.這也就是為何計算機內部不使用原碼錶示一個數.為了解決原碼做減法的問題,出現了反碼:計算十進位制的表示式:1-1=01-1=1+(-1)=[00000001]原+[10000001]原=[00000001]反+[11111110]反=[11111111]反=[10000000]原=-0發現用反碼計算減法,結果的真值部分是正確的.而唯一的問題其實就出現在"0"這個特殊的數值上.雖然人們理解上+0和-0是一樣的,但是0帶符號是沒有任何意義的.而且會有[00000000]原和[10000000]原兩個編碼表示0.於是補碼的出現,解決了0的符號以及兩個編碼的問題:1-1=1+(-1)=[00000001]原+[10000001]原=[00000001]補+[11111111]補=[00000000]補=[00000000]原這樣0用[00000000]表示,而以前出現問題的-0則不存在了.而且可以用[10000000]表示-128:(-1)+(-127)=[10000001]原+[11111111]原=[11111111]補+[10000001]補=[10000000]補-1-127的結果應該是-128,在用補碼運算的結果中,[10000000]補就是-128.但是注意因為實際上是使用以前的-0的補碼來表示-128,所以-128並沒有原碼和反碼錶示.(對-128的補碼錶示[10000000]補算出來的原碼是[00000000]原,這是不正確的)使用補碼,不僅僅修復了0的符號以及存在兩個編碼的問題,而且還能夠多表示一個最低數.這就是為什麼8位二進位制,使用原碼或反碼錶示的範圍為[-127,+127],而使用補碼錶示的範圍為[-128,127].因為機器使用補碼,所以對於程式設計中常用到的32位int型別,可以表示範圍是:[-231,231-1]因為第一位表示的是符號位.而使用補碼錶示時又可以多儲存一個最小值.