1. 程式人生 > >原碼 反碼 補碼 練習

原碼 反碼 補碼 練習

32位 log 輸出 lin .com ati 用兩個 整數 use

#include "iostream"
using namespace std;
#define INT_MIN (-2147483647-1)

int main()
{
    int i = -INT_MIN;
    int t = printf("%d,%d,%d,%d\n", ~i, -i, 1 - i, -1 - i);
    
    system("pause");
    return t;
}

http://m.nowcoder.com/questions?uuid=5f5f30bea94748fe903ff5616e73de00

(這本來是道題目,下面是別人的解析)

首先,-2147483648這個數為32位int所能表示的最小負數,而如果原碼為1000 0000 0000 0000 0000 0000 0000 0000(表示-0),

其反碼應為數值位取反,符號位不變,即1111 1111 1111 1111 1111 1111 1111 1111,補碼為反碼+1即為

0 000 0000 0000 0000 0000 0000 0000 0000 (最高位溢出,舍去),而+0 的原碼、反碼、補碼均為 0 000 0000 0000 0000 0000 0000 0000 0000,

如果用 1000 0000 0000 0000 0000 0000 0000 0000作為 -2147483648的原碼,則會導致 -2147483648和0的補碼表示一樣,因此,

計算機中規定用 1000 0000 0000 0000 0000 0000 0000 0000來作為 -2147483648的補碼,以確保-2147483648~2147483647都有唯一的補碼表示;

總結以上內容:正數的原碼、反碼、補碼形式一致,負數的反碼為原碼的數值位取反,補碼為反碼+1也即是原碼的數值位取反再+1,

計算機中以補碼表示數據和運算,而32位最小負整數的補碼為 1000 0000 0000 0000 0000 0000 0000 0000。

然後回到本道題目的解答:


首先,求 ~i , i的補碼為1000 0000 0000 0000 0000 0000 0000 0000,取反0111 1111 1111 1111 1111 1111 1111 1111,此為補碼,符號位為0,表示正數,正數原碼補碼一致,因而該數即表示231-1,即2147483647。


然後,求 -i ,要對一個數值執行單目運算符 - 表示的是對該數取反然後再+1,也即是我們常說的求補運算,註意這裏取反+1與原碼求補碼的區別!也就是求補運算與求補碼是不一樣的!例子(4位有符號整數):x=-4 1100(補碼) -x=~x+1 也即是 0011+0001=0100(4),而1100再求補碼應是先數值位取反,即1011,然後+1,變成1100!註意這兩者(求補與求補碼)之間的區別。

題目中 i的補碼為 1000 0000 0000 0000 0000 0000 0000 0000,取反+1,仍為 1000 0000 0000 0000 0000 0000 0000 0000,即 -2147483648


求 1-i 我們已經求出-i的補碼為1000 0000 0000 0000 0000 0000 0000 0000 加上1的補碼即為 1000 0000 0000 0000 0000 0000 0000 0001

該補碼表示的原碼為1 111 1111 1111 1111 1111 1111 1111 1111,即為- 2147483647


最後求-1-i -1的補碼為1 111 1111 1111 1111 1111 1111 1111 1111,加上-i補碼 1000 0000 0000 0000 0000 0000 0000 0000,

得 0111 1111 1111 1111 1111 1111 1111 1111,即 2147483647


另外補充一點,計算機中有符號數和無符號數的機器碼(補碼)是一樣的,同一個二進制碼按照有無符號輸出結果不一樣,例如本題中四個答案如果按照無符號整數輸出,那麽答案就是C


上面的求補和求補碼再舉個例子,例如:1(直接用兩個字節表示了,懶得寫那麽多o(╯□╰)o)

1(原碼): 0000 0001

求補

-1 (根據1的原碼)全部取反1111 1110,再加1,就是1111 1111

求補碼

-1(原碼):1000 0001

-1(補碼):(根據-1的原碼)符號位不變,數值位取反 1111 1110,再加1,就是1111 1111

即求補 NEG(X) = -X的補碼

(自己也查了些,但是上面的已經講得很清楚了)

http://blog.csdn.net/le119126/article/details/45072969

http://blog.sina.com.cn/s/blog_6f62c9510101svjz.html#cmt_55CFF849-7F000001-61447C38-984-8A0

原碼 反碼 補碼 練習