二補數

二補數是一種用二進位表示有符號數的方法，也是一種將數字的正負號變號的方式，常在電腦科學中使用。二補數以有符號位元的二進位數定義。正數和0的二補數就是該數字本身再補上最高位元0。負數的二補數則是將其絕對值按位取反再加1。二補數系統的最大優點是可以在加法或減法處理中，不需因為數字的正負而使用不同的計算方式。只要一種加法電路就可以處理各種有號數加法，而且減法可以用一個數加上另一個數的二補數來表示，因此只要有加法電路及二補數電路即可完成各種有號數加法及減法，在電路設計上相當方便。另外，二補數系統的0就只有一個表示方式，這和一補數系統不同，因此在判斷數字是否為0時，只要比較一次即可。右側的表是一些8-bit二補數系統的整數。它的可表示的範圍包括-128到127，總共256個整數。數字表示方式.說明.以下用4位元的二補數數字來說明二補數系統的數字表示方式。以上的表示方式在電腦處理時格外方便，用以下的例子說明：0011 (3)+ 1111 (-1)10010 (2)結果10010似乎是錯的，因為已經超過四個位元，不過若忽略掉第5個位元，結果是0010 (2)，和我們計算的結果一樣。而且若可以將二進位的1111 (-1)變號為0001 (1)，以上的式子也可以計算減法：3-1 = 2。在n位元的二補數加減法中，忽略第n+1個位元的作法在各種有號數加法下都適用，也可以用加法電路來處理減法。而數字的變號就用計算數字的二補數來完成。在一般n位元的二進位數字中，最高有效位元第 n位元表示符號位元，若符號位元為0，數字為正數或0，若符號位元為1，數字為負數。以下是n位元的二補數系統中，幾個特別的數字：因此，在8位元的二補數系統中，可以表示的最大正數為2"8"−1-1 = 127，可以表示最小的負數為 -2"8"−1 = -128計算二補數.在計算二進位制數字的二補數時，會將數字進行位元反相運算，再將結果加1，不考慮溢位位元，就可以得到該數字的二補數。以下考慮用有符號位8位元二進位表示的數字5：0000 0101 (5)其最高位元為0，因為此數字為正數。若要用二補數系統表示 -5，首先要將5的二進位進行反相運算〔1變為0，0變為11111 1010目前的數字是數字5的一補數，因此需要再加1，才是二補數：1111 1011 (-5)以上就是在二補數系統中 -5的表示方式。其最高位元為1，因為此數字確實為負數。一個負數的二補數就是其對應的正數。以 -5為例，先求數字的一補數：0000 0100再加一就是 -5的二補數，也就是5。0000 0101 (5)簡單來說，數字a的二補數即為 -a。若要計算n位數二補數二進位對應的十進位，需要知道每位數對應的數字，除了最高位元外，其他位元的對應數字均和一般二進位相同，即第i位數表示數字2"i−1"。但最高位元若為1時，其表示數字為 -2"n−1"，因此若用此方式計算0000 0101表示的數字，其結果為：1111 1011 (−5) = −128 + 64 + 32 + 16 + 8 + 0 + 2 + 1 = (−2"7" + 2"6" + ...) = −5特別的數字.有兩個數字的二補數等於本身：一個是0，另一個為該位元內可表示有符號位區分的二進位制形式的最大負數。0的二補數計算方式如下：先計算它的一補數：1111 1111再將一補數加一：0000 0000，溢位位元二進位制值 = 1忽略溢位，其結果為0。因此0的二補數為0。而0 x (-1) = 0，因此其二補數仍滿足「數字a的二補數為 -a」的原則。若計算1000 0000的二補數：先計算它的一補數：0111 1111再加一就是它的二補數。1000 00001000 0000 (-128)的二補數仍為1000 0000 (-128)。但(-128) x (-1) = 128，因此其二補數是以上規則的例外。總結：由於0可以等於0的二補數-0，以及同樣因為8位元的二補數可顯示的值範圍為 -128 ~ 127，但-128的二補數128無法用在已有位元數量為8的位元數量內的可用二補數表示。【在計算其他位數內的可表示有符號位區分的二進位制形式的最大負數時，也會有類似情形。】所以：0和-128的確是「數字a的二補數為 -a」原則中兩個特別的數字。其他計算方法.方法一.另一種計算formula_1的二補數formula_2 的公式如下：formula_3其中formula_4是整數的長度。以八位元的「-123」求其二補數為例：formula_5formula_6-123的二補數計算方式如下：formula_7formula_8formula_9方法二.以另一種較簡單的方式，可以找出二進位數字的二補數：以0011 1100為例：原數字 補碼0011 1100 ---- ---00011 1100 ---- --000011 1100 ---- -1000011 1100 1100 0100因此其結果為1100 0100符號延展.將一個特定位元二補數系統的數字要以較多位元表示時，所有增加的高位元都要填入原數字的符號位元。在一些微處理機中，有指令可以執行上述的動作。若是沒有，需要自行在程式中處理。==&gt;在二補數系統中，當數字要向右位移幾個位元時，在位移後需將符號位元再填入原位置，保持符號位元不變。以下是二個例子：數字 0010 1010 1010 1010向右位移一次 0001 0101 1101 0101向右位移二次 0000 1010 1110 1010而當一個數字要向左位移n個位元時，最低位元填n個0，權值最高的n個位被拋棄。以下是二個例子：數字 0010 1010 1010 1010向左位移一次 0101 0100 0101 0100向左位移二次 1010 1000 1010 1000向右位移一次相當於除以2，利用算術移位的方式可以確保位移後的數字正負號和原數字相同，因為一數字除以2後，不會改變其正負號。注意：向左位移一次相當於乘以2，雖然乘以在理論上並不會改變一個數的符號，但是在二補數系統中，用以表示數的二進位制碼長度有限，能夠表示的數的範圍也是有限的：若一個數的高權值上的數位已經被佔用，此時再將這個數左移若干位，高權值上的數將會失去，對於絕對值很大數，這將造成整體表達的錯誤。二補數的工作原理.為什麼二補數能這麼巧妙實現了正負數的加減運算？答案是：指定n位元字長，那麼就只有2"n"個可能的值，加減法運算都存在上溢位與下溢位的情況，實際上都等價於模2"n"的加減法運算。這對於n位元無符號整數型別或是n位元有符號整數型別都同樣適用。例如，8位元無符號整數的值的範圍是0到255.因此4+254將上溢位，結果是2，即formula_10。例如，8位元有符號整數的值的範圍，如果規定為−128到127，則126+125將上溢位，結果是−5，即formula_11。對於8位元字長的有符號整數型別，以2"8"即256為模，則formula_12所以模256下的加減法，用0, 1, 2,…, 254,255表示其值，或者用−128, −127,…, −1, 0, 1, 2,…,127是完全等價的。−128與128，−127與129，…，−2與254，−1與255可以互換而加減法的結果不變。從而，把8位元解釋為−128到−1，同樣也實現了模256的加減法，而且所需要的CPU加法運算器的電路實現與8位元無符號整數並無不同。實際上對於8位元的儲存單元，把它的取值[00000000,…, 11111111]解釋為[0, 255]，或者[-1, 254]，或者[-2, 253]，或者[-128, 127]，或者[-200, 55]，甚至或者[500, 755]，對於加法硬體實現並無不同。運算.加法.二補數系統數字的加法和一般加法相同，而且在運算完成後就可以看出結果的正負號，不需特別的處理。正數與負數相加不會出現上溢錯誤，因為它們的和一定會小於加數。上溢錯誤只有在兩個正數或兩個負數相加時才可能發生，這時候最高有效位會變成相反。以15加-5為例：11111 1110000 1111 (15)+ 1111 1011 (-5)0000 1010 (10)由於加數和被加數都是8位元，因此運算結果也限制在8位元內。第8位元相加後產生的進位不考慮的1被忽略，所以其結果為10。而15 + (-5) = 10，計算結果正確。在以上計算式中，可以由進位列的最左側二個位元得知結果是否出現溢位。溢位就是數字的絕對值太大，以致於無法在指定的二進位位元個數來表示。若進位列的最左側二個位元同為0或同為1，表示結果正確，若是一個為0，另一個為1，表示出現溢位錯誤。也可以對此二個位元進行異或運算，結果為1時，表示出現溢位錯誤。以下以7 + 3的4位元加法說明溢位錯誤的情形。01110111 (7)+ 0011 (3)1010 (−6) 結果不正確！在此例中，進位列的最左側二個位元為01，因此出現溢位錯誤。溢位的原因是7 + 3的結果(10)超過二補數系統4位元所可以表示的數字範圍 -8~7。故為防止溢位錯誤，二補數在進行加法運算時通常將符號位進行復制後追加到最高位之前，即設二補數B的位數為WIDTH，則B′={B[WIDTH-1],B}。應注意此處B′的位數為WIDTH+1。如上兩例用此方法進行計算：11 1111 1110 0000 1111 (15)+1 1111 1011 (-5)(1)0 0000 1010 (10)由於WIDTH+1=8+1=9，故而第十位的1同樣由於溢位而被省略，結果仍為10。兩負數相加時同理。1110 0111 (7)+ 0 0011 (3)0 1010 (10) 結果正確！由於WIDTH+1=4+1=5，故第五位的0仍為符號位，得結果正數10。減法.減法通常轉化為加法進行運算，將減數與被減數的補碼進行加法運算，即可得出差。乘法.乘法在電腦的世界裡其實就是不斷的做加法。例如:3*5=3+3+3+3+3=15除法.除法就是相減。例如：10/3=10-3-3-3=1mod3而減法又可做二補數相加，所以所有四則運算的基礎都是由加法而來。