C語言各種符號的使用介紹下篇_第1頁
C語言各種符號的使用介紹下篇_第2頁
C語言各種符號的使用介紹下篇_第3頁
C語言各種符號的使用介紹下篇_第4頁
C語言各種符號的使用介紹下篇_第5頁
已閱讀5頁,還剩4頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

第C語言各種符號的使用介紹下篇目錄1、按位運(yùn)算符1.1按位或(|)和按位與()1.2按位異或(^)1.3一個關(guān)于整型提升的問題2、移位操作符2.1左移右移操作符2.2習(xí)題練習(xí)3、++和--的操作3.1基本操作3.2從匯編角度深入理解a++

1、按位運(yùn)算符

1.1按位或(|)和按位與()

上期我們講到過邏輯或和邏輯與,他們得到的結(jié)果是真假值,但我們一定要區(qū)分清楚,按位運(yùn)算符|和與邏輯運(yùn)算符||是完全兩個概念。

按位,簡明之意,按數(shù)值二進(jìn)制位來進(jìn)行運(yùn)算,都是在數(shù)據(jù)補(bǔ)碼的基礎(chǔ)上進(jìn)行。

按位或|:兩個數(shù)值的二進(jìn)制補(bǔ)碼對應(yīng)位進(jìn)行運(yùn)算,對應(yīng)位有1則為1,否則為0。

按位與:兩個數(shù)值的二進(jìn)制補(bǔ)碼對應(yīng)位進(jìn)行運(yùn)算,對應(yīng)位都為1則為1,否則為0。

這里我們舉例說明:

1|2:

1的二進(jìn)制補(bǔ)碼:00000000...00000001

2的二進(jìn)制補(bǔ)碼:00000000...00000010

------按位或結(jié)果:00000000...00000011-對應(yīng)十進(jìn)制:3

12:

1的二進(jìn)制補(bǔ)碼:00000000...00000001

2的二進(jìn)制補(bǔ)碼:00000000...00000010

------按位與結(jié)果:00000000...00000000-對應(yīng)十進(jìn)制:0

其實(shí)有很多大學(xué)老師或者是書上都有可能把按位或,按位與,以及后面我們要講的按位異或,他們會把每位二進(jìn)制運(yùn)算后的結(jié)果稱為真或者假,其實(shí)這樣的說法是不夠嚴(yán)謹(jǐn)?shù)模婕偈沁壿嬇袛?,而按位運(yùn)算得到的結(jié)果是數(shù)值,而且在C語言中0表示假,非0為真,所以我是不推薦這種說法。

1.2按位異或(^)

按位或^:兩個數(shù)值的二進(jìn)制補(bǔ)碼對應(yīng)位進(jìn)行運(yùn)算,相同為0,不同為1。

這里我們舉例說明:

1^3:

1的二進(jìn)制補(bǔ)碼:00000000...00000001

3的二進(jìn)制補(bǔ)碼:00000000...00000011

---按位異或結(jié)果:00000000...00000010-對應(yīng)十進(jìn)制:2

5^0:

5的二進(jìn)制補(bǔ)碼:00000000...00000101

0的二進(jìn)制補(bǔ)碼:00000000...00000000

---按位異或結(jié)果:00000000...00000101-對應(yīng)十進(jìn)制:5

結(jié)論:任何數(shù)異或0都等于它本身

這里有一道筆試題:不創(chuàng)建臨時變量,實(shí)現(xiàn)兩個數(shù)的交換。

//很多小伙伴直接想出來的做法:

intmain()

inta=10;

intb=20;

printf("a=%d,b=%d\n",a,b);

a=a+b;

b=a-b;

a=a-b;

printf("a=%d,b=%d\n",a,b);

return0;

}

但是我們仔細(xì)研究下這段代碼,他有沒有什么隱藏的問題呢?

一個整型,占四個字節(jié),也就是32個比特位,這里進(jìn)行加法運(yùn)算,就會產(chǎn)生進(jìn)位,萬一我們是兩個很大的數(shù)相加呢?他們的和超過了整型最大存儲范圍,那么在計(jì)算機(jī)里面就會發(fā)生截?cái)?!為了避免發(fā)生這種現(xiàn)象,我們可以采取異或的方法來實(shí)現(xiàn)這道題:

最后還有一個很簡單的按位取反操作符:~

用途:對一個數(shù)的二進(jìn)制按位取反(包括它的符號位)

注意:以上的位運(yùn)算符,他們的操作數(shù)必須是整數(shù)!

1.3一個關(guān)于整型提升的問題

有這樣一串代碼,問:為什么一個char類型大小可以求出來是4字節(jié)?

無論任何位運(yùn)算符,都是要計(jì)算機(jī)進(jìn)行計(jì)算的,而計(jì)算機(jī)中CPU具有運(yùn)算能力,但計(jì)算的數(shù)據(jù)都是放在內(nèi)存中的。所以,做任何運(yùn)算,都必須將數(shù)據(jù)從內(nèi)存拿到CPU的寄存器中。而寄存器默認(rèn)的操作數(shù)寬度是32位,可是,char類型數(shù)據(jù)只有1個字節(jié),也就是8位,不滿足32位怎么辦,這就需要整型提升了?。ㄔ敿?xì)整型提升大家可以查閱資料哦)

如果是一個有符號數(shù)的話:高位補(bǔ)符號位

如果是一個無符號數(shù)的話:高位補(bǔ)0

2、移位操作符

2.1左移右移操作符

左移運(yùn)算符是一個雙目運(yùn)算符,功能是把左邊的運(yùn)算數(shù)的各個二進(jìn)制位向左移動指定位數(shù)。

右移運(yùn)算符是一個雙目運(yùn)算符,功能是把右邊的運(yùn)算數(shù)的各個二進(jìn)制位向右移動指定位數(shù)。

注意:

左移:最低位丟棄,最高位補(bǔ)零

右移:

無符號數(shù):最低位丟棄,最高位補(bǔ)零[邏輯右移]有符號數(shù):最低位丟棄,最高位補(bǔ)符號位[算數(shù)右移]

以上在補(bǔ)碼中進(jìn)行運(yùn)算

警告:移位運(yùn)算符,請不要移動負(fù)數(shù)位,這是標(biāo)準(zhǔn)未定義的!

左移我們好說,主要是右移我們需要細(xì)講一下:

明顯看到,這是在無符號數(shù)下進(jìn)行右移,第一個小伙伴都不會感到驚訝,可是第二個就有點(diǎn)不理解了,我們來解釋下:

這里有一個問題,當(dāng)-1準(zhǔn)備放入變量b的時候我們需要看-1的類型嗎?

答案是不需要!內(nèi)存中放的都是二進(jìn)制補(bǔ)碼,本質(zhì)上是把-1的補(bǔ)碼放入變量b當(dāng)中,第二,右移操作符屬于計(jì)算,需要在CPU中進(jìn)行,所以需要先把內(nèi)存中-1的補(bǔ)碼拿到CPU寄存器中運(yùn)算,按照我們的規(guī)則,右移中,無符號數(shù)低位丟棄高位補(bǔ)零,所以-1右移完成之后就變成了01111111...11111111,接著我們以%d有符號整型打印,就會把他當(dāng)作有符號數(shù)看待,最高位是0所以被認(rèn)為是正數(shù),轉(zhuǎn)化成十進(jìn)制也就是如上打印的值。

第二個我們來看下有符號數(shù)右移:

這個相信大家就很好理解了,第一個高位補(bǔ)符號位也就是補(bǔ)0,低位丟棄,所以結(jié)果是0,第二個高位補(bǔ)符號位也就是補(bǔ)1,低位丟棄,值仍然不變,還是-1。

注意:a1并不會改變a變量的值,就好比如a+1。這樣寫才會改變:a=a1;

2.2習(xí)題練習(xí)

學(xué)完了上期的邏輯操作符,和本期的移位操作符,我們來練練手:

請你設(shè)計(jì)一個宏可以指定數(shù)據(jù)第幾個比特位更改為1,并設(shè)計(jì)一個函數(shù)將各個比特位打印出來。

//參考

#defineSETBIT(a,num)((a)|=(1(num-1)))

voidPrintBit(inta)

intnum=31;

while(num=0)

if((a(1num)))

printf("1");

else

printf("0");

--num;

printf("\n");

intmain()

inta=0;

SETBIT(a,5);

PrintBit(a);

return0;

}

3、++和--的操作

3.1基本操作

其實(shí)這節(jié)知識點(diǎn)理解起來是很簡單的,只不過總有些學(xué)校喜歡出一些很拉跨的題目:

inti=3;問:(++i)+(++i)+(++i)的值是多少?

我的建議是,看到這類題,直接空著,你也可以在下面添一句,你禮貌嗎?

這種表達(dá)式,在任何編譯器下算出來的結(jié)果是不一樣的!

對于這種問題沒必要去爭論誰對誰錯,如果有人想跟你杠的話,那么你直接告訴他,你真的超級高水平。

好了,言歸正傳,我們來說一下++和--的基本理解:

前置++--:先自增(減),再使用后置++--:先使用,再自增(減)如果沒有變量接收,那么直接自增。

例子:

基本使用就是這么多,接下來我們從匯編角度來深度理解一下:

3.2從匯編角度深入理解a++

既然我們知道,后置++是先使用后++,如果我們單純的就++一下呢,他這個值被使用到了哪里去了呢?

intmain()

inta=0xDD;

intb=a++;//有b接收,那么a的先使用是將a的值(

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論