學習按位取反時,一直不是很理解,為啥對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,則該位的...