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

2021-10-07 03:24:36 字數 1243 閱讀 3852

今天遇到乙個問題,問下面程式的輸出結果是多少。

#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位...