補碼和取反

2021-06-13 05:51:19 字數 734 閱讀 1061

在計算機中,數值是以其補碼儲存的:

正數的補碼和原碼相同;

負數的補碼:將該數的絕對值(即除符號位)的二進位制形式按位取反再加1。

舉例:~0 = -1 (~運算子指對所有位取反,包括符號位)

0 的機器碼(原碼):0|0000000000000000000000000000000

-1的機器碼(補碼):1|1111111111111111111111111111111

很明顯,1|1111111111111111111111111111111是乙個負數的補碼,得到負數原碼的方法:減1 、(除符號位)取反。

有如下程式:int x=-20; printf("%d\n",~x);,其輸出結果將是( )。

a、19

b、20

c、21

d、-1

1000 0000 0001 0100:原碼 -20

1111 1111 1110 1100:補碼 -絕對值取反加一

0000 0000 0001 00 11:補碼取反 19

char型別的取值範圍是-128~127

負數儲存方式為:絕對值按位取反再加一。-128絕對值128。二進位制10000000。取反01111111,加一10000000,負數不用加符號位了。絕對值取反加一就行。

short型別的取值範圍是-32768~+32767

-128是個特例,因為它最高位為符號位和數值的復用,理解不了的話,就只理解-127好了,然後-128比它小一.

補碼與符號位取反

先來乙個 c 語言的小例子 include include int main void 對於16位的整數 n 按位與執行將最高位設定為0 符號位 得到的結果卻不是 1 結果是 32767 原因在於有符號整數的實現方式。有符號整數,最容易想到的方式是在最高位加乙個符號位,0表示整數,1表示負數,其它位...

由按位取反複習原碼和補碼知識

今天遇到乙個問題,問下面程式的輸出結果是多少。include intmain 我們首先要知道按位取反 的運算規則 1 0 0 1 第一反應,這不就是0嗎?啊呸,問題不可能這麼簡單,i又不是 1!記得int型別的本質是4位元組補碼,呃 什麼補碼?什麼原碼?不好意思,之前學的計算機基礎知識又還給教材了,...

Python按位取反實現過程(原碼補碼)

對二進位制數按位取反時,輸出結果與 以為的結果 不一致。原因是計算機中數是以補碼形式進行儲存的。不涉及原碼補碼理論,僅記錄按位取反的實現過程。計算機中原碼補碼計算規則 計算機儲存8位,左到右為7 0,最高位為符號位,1為負,0為正 計算機中以補碼形式儲存 正數的原碼與補碼相同 負數的補碼為原碼按位取...