回覆列表
  • 1 # 使用者8340287731518

    丟開教科書式的概念,想想為什麼要有補碼這個東西,為什麼符號位會產生。定義:

    原碼錶示法是機器數的一種簡單的表示法。其符號位用0表示正號,用:表示負號,數值一般用二進位制形式表示。

    機器數的反碼可由原碼得到。如果機器數是正數,則該機器數的反碼與原碼一樣;如果機器數是負數,則該機器數的反碼是對它的原碼(符號位除外)各位取反而得到的。

    機器數的補碼可由原碼得到。如果機器數是正數,則該機器數的補碼與原碼一樣;如果機器數是負數,則該機器數的補碼是對它的原碼(除符號位外)各位取反,並在未位加1而得到的。

    如果是為了考試,死記即可。但我總想搞清楚為什麼計算機裡面的數要這樣子表達?意義何在?-128的補碼為什麼是10000000?為什麼補碼有這麼奇怪的運算規則?計算機算減法的時候都需要從原始碼到補碼的計算嗎?

    思路計算機裡面,只有加法器,沒有減法器,所有的減法運算,都必須用加法進行。用補數代替原數,可把減法轉變為加法。出現的進位就是模,此時的進位,就應該忽略不計。二進位制下,有多少位數參加運算,模就是在 1 的後面加上多少個 0。補碼就是按照這個要求來定義的:正數不變,負數即用模減去絕對值。補充解釋一下“模”的概念,可以參照離散數學裡面的環:考慮時鐘上時間的計算,假設現在時針指向數字3,若問“6小時前時針指向的數字是幾”,則可以:1. 將時針逆時針撥動6格。2. 將時針順時針撥動12 - 6 = 6格。兩者的結果是一樣的。這裡稱12為“模”。故有 3時 - 6個小時 = 3時 + (12 - 6個小時),這裡可以看到將減法轉換成加法的過程,即“加上模減去絕對值的差”。所以,假設模是10,有效位數為1,當我們計算 9 - 7 的時候:9 - 7 => 9 + (10 - 7) = 12,去掉最高的位後,得到2,這是正確的結果。

    作者的意思是說,計算機裡面所有數都以補碼形式儲存,加減運算都是補碼之間的加法運算。然後作者提出了一個我之前沒聽過的觀點:

    補數 和 補碼的定義式 裡面,根本就沒有什麼符號位。這最高位的1、0是自然出現的,並不是由人來規定的。

    的確,符號位在補碼運算裡面是“模”,本身並不帶符號的意義。因為計算機將加法轉換成加上一個“負數”,而負數又以補碼的形式表現。補碼比原始碼多一位,從這多出來的一位可以推斷出原來數字的正負號,所以成為了符號位。也可以這樣認為,留出一位(不全部佔滿)的原因是要用“模”來表示正負數。

    也就是說,不是特意留出一個符號位,用1和0來表示正負號。而是補碼運算可以用最高位來表示正負,所以符號位誕生了。

    那麼為什麼-128的補碼是10000000?可以這樣理解。-128是一個負數,所以它的補碼是它的“模”減去它的絕對值,即:

    那麼為什麼負數補碼等於原始碼的反碼加一呢?可以這樣推導:

    由此我們得知,在計算機裡面所有的數字都以補碼形式儲存。127存成01111111,-127存成11111111,算減法就變成算加法了,儘管你看到的是“-”號。

  • 中秋節和大豐收的關聯?
  • 世界上有沒有一句話,是大家聽來,都十分的有道理的?