計算機中數的表示形式 原碼 反碼 補碼

  計算機中的數字分爲無符號數字和有符號數字。無符號數字對應的二進制位全部位都用來表示數,無符號數字就是正數,其在內存的表示的形式就是其對應的二進制。而對於有符號數字在內存中表示至關麻煩,由於其對應的二進制位中最高位要用來表示數字的正負(最高位爲1時爲負數,爲0時表示正數),並不能全部位全用來表示數字。設計

  無符號數字,由於其全部二進制位都能用來表示數字,因此對於單字節的二進制位能夠表示無符號數的範圍區間是[0,255],共256個數字。在計算機內存中,直接用無符號數對應的二進制來表示無符號數是符合邏輯的。內存

  有符號數字,由於最高位要用來表示數字的正負,全部並不能用其對應的全部二進制位來表示數字。對於單字節的二進制位1111 1111表示爲最小數-127,二進制位0111 1111表示最大數127。所以對於單字節的二進制位能夠表示有符號數的範圍區間是[-127,127],共255個數字,其中二進制位1000 0000表示負0,二進制位0000 0000表示正0。若是這樣直接用有符號數對應的二進制在內存中表示這些數就不符合邏輯了,由於無符號數要表示256個,一樣有符號也要表示256個數字。若是把1000 0000表示的負0分爲-128,正好能夠變有符號數的範圍爲[-128,127],這樣就能和無符號數表示範圍對應上了。若是這樣的話,硬件CPU在處理數據時,-127+(-1)=負127的二進制+負1的二進制=1111 1111 + 1000 0001 = 1 0000 0000, 單字符溢出後變爲0000 0000表示正0,並非1000 000表示的-128;若是非要這麼操做,就要增長CPU設計難度,由於計算機最適合處理有規律的計算。因此這種直接用二進制在內存中表示有符號數字的方法明顯不能應用,會給硬件CPU設計帶來難度。數學

  計算機的有原碼,反碼和補碼。這些二進制位的操做是爲了解決有符號數字在內存中表示方式不足的。原碼就是數字自己對應的二進制,反碼就是在原碼的基礎上符號位不變其他位取反,補碼是在反碼的基礎上加1一個二進制位。基礎

  無符號數字,能夠直接使用其對應的二進制來表示內存中的形式,都是正數。因此規定正數原碼,反碼和補碼都是其二進制自己。硬件

  有符號數字,不能夠直接使用其對應的二進制來表示內存中的形式,因此要引用原碼,反碼和補碼之間的關係來解決這個問題。-127對應的原碼是其二進制1111 1111,反碼是1000 0000,補碼是1000 0001;127正數原碼,反碼和補碼都是其二進制自己,爲0111 1111;把0劃給正數時原碼,反碼和補碼都是其二進制自己0000 0000;把0劃給負數時原碼1000 0000,反碼1111 1111,補碼1 0000 0000;由於對於數學邏輯而言,並無正0和負0之分,0既不是正數也不是負數,因此把0000 0000表示的正0定義爲0,把1000 0000表示的負0表示爲負128的補碼。這樣對於設計CPU而言也能夠減小困難,由於計算機中並無減法,減法用加上一個數的負數表示。例如-127+(-1) = 負127內存補碼 + 負1內存補碼 = 1000 0001 + 1111 1111 = 1 0000 0000=負0的補碼 = 規定的負128的補碼(所以-128只有規定的補碼,並沒有對應的原碼)。這樣就能解決硬件CPU設計上的困難;再例如127-1=127內存補碼 + 負1的內存補碼=0111 1111 + 1111 1111 = 1 0111 1110 = 0111 1110(捨去最高位)=126。引用

  想要理解上面內容要先複習一下二進制的數學運算,適當瞭解一下內存的單位字節。二進制

相關文章
相關標籤/搜索