在計算機中,數值是以其補碼儲存的:
正數的補碼和原碼相同;
負數的補碼:將該數的絕對值(即除符號位)的二進位制形式按位取反再加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為正 計算機中以補碼形式儲存 正數的原碼與補碼相同 負數的補碼為原碼按位取...