1s-and-2s-complement
補數,也叫補碼,有“1的補數”和“2的補數”之分,前者多稱為“反碼”,后者干脆就直接叫“補碼”。
為什么計算機系統需要補碼,推薦這篇關于2的補碼。
介紹兩者操作細節的文章,也不在少數,本篇不再贅述。但是數次的看到“正數的補碼是其本身”這句高亮的句子,著實令人困惑。我在這里嘗試解決下。
首先,對于二進制數來說,只要定好了位長,進行反碼(1的補數)和補碼(2的補數)其實是一件很簡單的事情。在純二進制的表示下,只有0和1,別無他物。0111(4位)的反碼就是1000,補碼就是1001(反碼加1)。所謂正負、符號這些人賦予的意義都不存在,只有二進制數和這些簡單操作。
那么,為什么會出現“正數的補碼是其本身”這種說法呢?
在計算機中表示負數,如果用最高位表示符號這種“原碼”方式,雖然有利于人的閱讀,但不利于其本身的計算。所以系統內部就把負數統一用“其對應正數的補碼”來表示,而正數自己不用改變。這樣變換后,正數雖然形式上沒有變,但與原碼相比,含義卻變了,因為符號位已經不再是符號位了,此時的正數和負數都具有了統一的“補碼形式”或稱都在一致的“補碼編碼空間”中。
原碼空間到補碼空間的轉換,并非對每個數點都進行補碼運算,只是負數需要,正數不需要而已。
簡單來說,“正數的補碼是其本身”,這句話想表達含義的意思是,正數在計算機“補碼編碼空間”中的表示和原碼一致。但這絕不等價于“對正數進行補碼運算,結果是其本身”。