C語言按位取反 的簡單理解

2021-10-23 23:12:16 字數 1864 閱讀 9510

學習按位取反時,一直不是很理解,為啥對0取反就是-1,對76取反就是-77,網上有說記住x+(~x)=-1就可以了,可還是有點難懂。所以我來解釋一波為啥對0取反就是-1

十進位制數0的十六進製制表示為 0000 0000

對其~(取反)後得到 1111 1111

此時這個值轉化為十進位制就是255

此時255-256=-1

同理76的十六進製制為 0100 1100,取反後為1011 0011,轉為十進位制數為179,179-256=-77

這裡其實就是有符號數的轉化,在8位的範圍內(0~255),最大值就只能到255。

當然,對於16位、32位數也適用,大家可以試一試。

——無符號數中的負數怎麼表示

無符號的8位數值中,由於不能為負值,所以-1實際上不能以-1的形式存在(很繞但確實是這樣的),實際你看到的顯示出來的數值為255,這是為啥呢?

例如下面這樣:

#include

typedef

unsigned

char u8;

//8位無符號數,範圍0~255

intmain

(void

)

結果是

255
我們定義了乙個8位的無符號數值,所以它的範圍是0~255,-1不在這個範圍內,所以此時它如何顯示?這涉及到負數在計算機中的表示了。

我們知道,在計算機系統中資料都是以補碼形式儲存的,只不過正數的補碼等於反碼又等於原碼。而負數的補碼等於對原碼取反加1

那我們求一下-1的補碼(8位數值)

原碼:1000 0001,(最高位為符號位,為1代表負數,為0代表正數)

反碼:1111 1110,(符號位不變,其他位按位取反)

補碼:1111 1111,(反碼 + 1)

我們看這個補碼是不是很熟悉??

沒錯,這個-1的補碼也就是我們無符號數255的原碼和補碼;

正數的補碼等於其本身

這裡就有乙個疑問,數值的原碼首位不是符號位嗎?為啥1111 1111卻可以表示為正數255呢?

如果你的變數是8位的帶符號的數,那麼最高位第7位作為符號位用,最高位為0時表示是正數,為1時表示是負數;而無符號數是相對於有符號數而言的,指的是整個機器字長的全部二進位制位均表示數值位,相當於數的絕對值。

也就是說無符號數沒有符號位,符號位是有符號數玩的把戲。

在無符號數中,1111 1111是255,但在有符號數中,1111 1111就是-1的補碼。

所以我們原本是想在乙個無符號數中表示乙個有符號數(-1),這是不現實的,但最終計算機妥協了,不過是以無符號數的形式(255)表現出來的有符號數(-1)。

正數的原碼=反碼=補碼。引進補碼的作用是為了讓計算機更方便做減法。

例如:按時間12個小時來算,現在的準確時間是4點,有乙個表顯示的是7點,如果要校準時間,我們可以將時針退7-4=3格,也可以向前撥12-3=9格,計算機做減法就可以使-3轉化為+9,這樣可以簡化計算機的硬體裝置去做複雜的減法。

所以補碼反碼就是為了簡化減法而來的,將減號化為負數,再將負數化為補碼求加法,跟正數沒關係。所以不管是正整數還是正小數,原碼,反碼,補碼都全部相同。1

↩︎

python語言按位取反 python的按位運算

華電北風吹 天津大學認知科學與計算重點實驗室 最後修改日期 2015 8 6 python提供了豐富的位運算操作符,例如按位與,按位或,按位異或,左移位,右移位和取反操作,例子 如下 a,b 45,83 bin a bin b 0b101101 0b1010011 a b,bin a b 127,0...

C語言按位與 按位或 按位異或 按位取反 (一)

與運算 兩者都為1為1,否則為0 1 1 1,1 0 0,0 1 0,0 0 0 或運算 兩者都為0為0,否則為1 1 1 1,1 0 1,0 1 1,0 0 0 非運算 1取0,0取1 1 0,0 1 10001 01110 異或運算 兩者相等為0,不等為1 1 1 0,1 0 1,0 1 1,0...

C語言按位與 按位或 按位異或 按位取反(二)

位運算是指按二進位制進行的運算。在系統軟體中,常常需要處理二進位制位的問題。c語言提供了6個位操作運算子。這些運算子只能用於整型運算元,即只能用於帶符號或無符號的char,short,int與long型別。c語言提供的位運算子列表 運算子 含義 描述 按位與 如果兩個相應的二進位制位都為1,則該位的...