記錄
在學習C語言數據范圍時了解到了補碼的概念,記錄一下什么是補碼,補碼怎么運算的
運算
原文鏈接:https://www.cnblogs.com/lsgsanxiao/p/5113305.html
補碼主要是為了cpu運算器在進行減法運算時避免借位而設立的。
在早期,cpu中的運算器部分,只要實現一個加法器就可以完成四由算術運算。
因為計算機中的數值編碼是有限位數的,所以減法實際上相當於加上減數的補碼,而乘法是循環的加法,除法是循環的減法。這種思想在數學上叫轉化思想,在兵法上與”借刀殺人“、”借屍還魂“的借是“異曲同工”,用牛頓的話叫做“站在巨人的肩上“。
舉例說明,以8位的二進制為例,要計算1-1,只要用1加上-1的補碼即可。
-1的原碼:1000 0001,最高位是符號為,1表示負數,0表示正數。
-1的反碼:1111 1110, 按位取反是除符號位以外,其它每個位上的0變成1,1變成0。
-1的補碼:1111 1111,在反碼的基礎上是加上1即為補碼。
1-1 = 1+ 1111 1111 = 1 0000 0000 ,因為只有8位的二進制表示方法,此時溢出了,溢出位在硬件上是沒法表示的,因此結果還是0.
鏈接:https://www.cnblogs.com/yf4695/p/9102411.html
對於有符號類型的數據,它的最高位為符號位,正數的符號位是 0 ,負數的符號位是 1
正數的原碼、反碼、補碼都一樣
計算機中實際存儲的是補碼
負數如-15,10001111(原碼),11110000(反碼,符號位不變,其余為取反),11110001(補碼,反碼加1);將負數的補碼化為原碼:先減1,然后符號位不變,其余位取反
負數的原碼+補碼=00000000
如果只是通過負數的補碼求其絕對值,則:將補碼全部位取反+1(11110001(-15補碼)--->00001110--->00001111)