有時候在程式設計的時候,跟蹤**查錯,明明傳過來的-1,但結果顯示的是
0xffff;其實這就是-1的補碼。了解原碼,反碼,補碼對自己程式設計還是有一定
幫助的,之前也只是模糊的了解一點,最近查了一些資料,記錄下來,以免自己
忘記原碼:因為我們看到的十進位制數,存入計算機的時候,都會轉化成二進位制,
計算機只認識二進位製碼。比如:「3」 -> 0x0000 0011;
反碼:原碼為正數時,和原碼一樣。負數時,除了第一位符號位,其餘位置取反
,補碼:原碼為正數時,和原碼一樣。負數時,等於反碼+1,
公式:[+1] = [00000001]原 = [00000001]反 = [00000001]補
[-1] = [10000001]原 = [11111110]反 = [11111111]補
為什麼要反碼和補碼呢?原碼不就可以了解決問題了嗎?
比如:1 - 1 = 0;
1 - 1 = 1 + (-1) = [00000001]原 + [10000001]原 = [10000010]原 = -2
為什麼變成1 + (-1)呢? 因為計算機很笨,只認識+法,不認識減法;也不認識
乘除法,我們寫程式能做加減乘除,都是轉變成+來完成的。具體怎麼轉換,可以查
一些資料,主要是用到移位和各種操作符號的結合,最終轉換為+運算。
回歸主題,很明顯-2不是我們要的結果,對吧。
用反碼運算:
1 - 1 = 1 + (-1) = [0000 0001]原 + [1000 0001]原= [0000 0001]反 + [1111 1110]反 = [1111 1111]反 = [1000 0000]原 = -0
能得到我們要的結果,但是,結果為「-0」,0 是不分正負號的,這樣做很明顯
有會多占用乙個位置;
用補碼運算:
1-1 = 1 + (-1) = [0000 0001]原 + [1000 0001]原 = [0000 0001]補 + [1111 1111]補 = [0000 0000]補=[0000 0000]原
這樣的結果,就不會帶符號了,符合我們的要求;
程式中使用二進位製碼,會提高我們的程式執行效率,以及減少空間。當然大多數
情況是體現不出這種效率的。但是了解之後用來調錯還是不錯的。
網上有很多利用原碼,補碼,反碼,來解決日常經常碰到的一些問題:效率都非
常高,而且也比較簡潔;
比如:交換2個數;
a^=b;
b^=a;
a^=b;
這樣就實現了,a和b數字的交換。沒有用到第三個變數,存資料。
網上還有很多類似的技巧,有時間可以在網上查一下,對提公升自己寫程式會有很
大幫助的;
原碼 反碼 補碼
正數 原碼 反碼 補碼一樣 7 原 0 0000111 b 7 反 0 0000111 b 7 補 0 0000111 b 負數 原碼就是原來的表示方法 反碼是除符號位 最高位 外取反 補碼 反碼 1 7 原 1 0000111 b 7 反 1 1111000 b 7 補 1 1111001 b 當...
原碼 反碼 補碼
正數 原碼 反碼 補碼一樣 7 原 0 0000111 b 7 反 0 0000111 b 7 補 0 0000111 b 負數 原碼就是原來的表示方法 反碼是除符號位 最高位 外取反 補碼 反碼 1 7 原 1 0000111 b 7 反 1 1111000 b 7 補 1 1111001 b 當...
原碼 反碼 補碼
數值在計算機中表示形式為機器數 計算機只能識別0和1,使用的是二進位制,而在日常生活中人們使用的 是十進位制,正如亞里斯多德早就指出的那樣,今天十進位制的廣泛採用,只不過我們絕大多數人生來具有10個手 指頭這個解剖學事實的結果.儘管在歷史上手指計數 5,10進製 的實踐要比二或三進製計數出現的晚.摘...