今天遇到乙個問題,問下面程式的輸出結果是多少。
#include
intmain()
我們首先要知道按位取反(~)的運算規則:
~1=0; ~0=1;
第一反應,這不就是0嗎?
啊呸,問題不可能這麼簡單,~i又不是 ~1!
記得int型別的本質是4位元組補碼,呃…什麼補碼?什麼原碼?不好意思,之前學的計算機基礎知識又還給教材了,hhh…
我是一條華麗的分割線
呸,走錯地方了,這又不是知乎。
好,我們來看題,題目定義了int i=1,問~i的輸出結果是多少。
首先我們要明確計算機表達數值的特點:
二進位制,由於數位電路的兩種狀態,計算機內部只能用0和1兩種符號表達數值。在這個條件的約束下,計算機能夠表達的數值只能是正整數或0,因為計算機表達數值時沒有正、負號和小數點。
定長,計算機用固定位數的二進位制表達數值。
再回顧原碼定義:
令n位二進位制數中的最高位為符號位,且0表示正號,1表示負號,用剩餘的n-1位表示該數的絕對值,即形成原碼。
比如在8位二進位制下我們表示3的原碼:0000 0011
,
-3的原碼:1000 0011
我們再來看補碼:
x的補碼,當x>=0時,(x)補=(x)原=x;當x<0時,(x)補是在(x)原基礎上進行:除符號位外,按位取反,末位加一。
比如(-3)補=(1000 0011)原=(1111 1100+1)補=
(1111 1101)補
然後我們分析一下,i 是int型別,就是說i是以4位元組補碼形式儲存在計算機的,乙個位元組8個位,4*8=32,共32個位。又因為i 的值為1,所以計算機記憶體中的1的補碼應該是:
(0000 0000 0000 0000 0000 0000 0000 0001)補
將上述二進位制數按位取反,將得到:
(1111 1111 1111 1111 1111 1111 1111 1110)補
按補碼和原碼的關係,轉成原碼為:
(1000 0000 0000 0000 0000 0000 0000 0010)原
上述原碼的十進位制值是:-2
所以,~i輸出的結果是-2!
python 中按原碼取反 按位取反
在python中,按位運算的結果與c c 中位運算結果不同,原因主要是c c 是按原碼來取反。而在python中,取反的運算的流程是這樣的 先獲得其二進位制 原碼 進行取反操作。將第一步的結果,當作補碼。求這個補碼的原碼,這個原碼就是輸出的結果。補 碼求原碼的過程,先減1,再取反。由於是這樣的邏輯,...
Python按位取反實現過程(原碼補碼)
對二進位制數按位取反時,輸出結果與 以為的結果 不一致。原因是計算機中數是以補碼形式進行儲存的。不涉及原碼補碼理論,僅記錄按位取反的實現過程。計算機中原碼補碼計算規則 計算機儲存8位,左到右為7 0,最高位為符號位,1為負,0為正 計算機中以補碼形式儲存 正數的原碼與補碼相同 負數的補碼為原碼按位取...
按位取反符
二進位制數在記憶體中以補碼的形式儲存。按位取反 二進位制每一位取反,0變1,1變0。9的計算步驟 轉二進位制 0 1001 計算補碼 0 1001 按位取反 1 0110 轉為原碼 按位取反 1 1001 末位加一 1 1010 符號位為1是負數,即 10 var x 10 在計算機中乙個整型數4位...