原碼 反碼 補碼和 2147483648的補碼表示

2021-10-06 11:31:02 字數 1569 閱讀 2626

在網上看到乙個挺奇怪的說法:乙個整數的原碼是這個數的絕對值的原碼,然後他就得出了

00000000 00000000 00000000 00000101 是 5的 原碼

然後他又說反碼就是32位的每一位都取反

比如:將00000000 00000000 00000000 00000101每一位取反,得11111111 11111111 11111111 11111010。

稱:11111111 11111111 11111111 11111010 是 00000000 00000000 00000000 00000101 的反碼。

然後:

補碼:反碼加1稱為補碼。

也就是說,要得到乙個數的補碼,先得到反碼,然後將反碼加上1,所得數稱為補碼。

比如:00000000 00000000 00000000 00000101 的反碼是:11111111 11111111 11111111 11111010。

那麼,補碼為:

11111111 11111111 11111111 11111010 + 1 = 11111111 11111111 11111111 11111011

所以,-5 在計算機中表達為:11111111 11111111 11111111 11111011。轉換為十六進製制:0xfffffffb。

真真是有毒,怎麼對著5的原碼一頓操作就得到了-5的補碼呢?完全沒有區別正數和負數的區別,最後還自欺欺人的自洽了。

搞得我都差點信了,就算他說的是負數的轉換方式,假設他知道正數的原碼、反碼、補碼等於他自身(5的 原碼、反碼、補碼都是00000000 00000000 00000000 00000101 ),

那他也把-5的原碼搞錯了:

-5的原碼:10000000 00000000 00000000 00000101

而且負數原碼轉反碼的方法也跟著錯了:最高位是符號位不變,剩下31位按位取反

這樣子想在解決求負數的補碼的問題的時候是可以走捷徑的——直接把負數的絕對值代表的二進位制數取反再加1就可以了。可是萬一真的有人不知道最高位是符號位呢,不會吧不會吧。而且求-2147483648的補碼該怎麼做呢?它沒有對應的二進位制正數。

,如果是上面的思想還認為-0的原碼和0的原碼一樣是00000000 00000000 00000000 00000000那就不好做了。

-2147483648的補碼是10000000 00000000 00000000 00000000

把數字都轉換成補碼的好處是減法可以當作加法計算:

1-1=1和-1的補碼進行加法計算(符號位也要當數字來計算)=00000000 00000000 00000000 00000001+11111111 11111111 11111111 11111111=00000000 00000000 00000000 00000000(最高位的第33位捨去了),把結果當補碼轉換成原碼就是0

原碼 反碼和補碼

數值有正負之分 計算機就用乙個數的最高位存放符號 0為正 1為負 這就是機器數的原碼了 假設機器能處理的位數為 8.即字長為 1byte,原碼能表示數值的範圍為 127 0 0 127 共256個.有了數值的表示方法就可以對數進行算術運算 但是很快就發現用帶符號位的原碼進行乘除運算時結果正確 而在加...

原碼 反碼 和 補碼。

這裡只講下自己對反碼的理解。大家都知道使用反碼表示負數有兩個優點,1.可以使得減法可以和加法一樣。2.符號位也參與了運算。那這是為什麼呢?下面可以進行一些簡單的數學推導 根據反碼定義,對於負數,反碼是除符號為以外取反 1。例如,4 變換步驟如下。a 4 0 000 0100 b 取反 0 111 1...

原碼 補碼和反碼

1 原碼表示法 原碼表示法是機器數的一種簡單的表示法。其符號位用0表示正號,用 表示負號,數值一般用二進位制形式表示。設有一數為x,則原碼表示可記作 x 原。例如,x1 1010110 x2 一1001010 其原碼記作 x1 原 1010110 原 01010110 x2 原 1001010 原 ...