前言:目錄
前言:
一、操作符的分類
二、詳解操作符
1.算術(shù)操作符
2.移位操作符
1.原碼、反碼、補(bǔ)碼
2.左移位操作符
3.右移位操作符
三、位操作符
1.按位與&?
2、按位或 |?
3、異或^?
總結(jié):
一、操作符的分類我們前邊對(duì)數(shù)組進(jìn)行了系統(tǒng) 的學(xué)習(xí),并且制作了三子棋游戲,相信大家對(duì)數(shù)組有了一個(gè)更為深入的了解,從今天開始,我們就要對(duì)操作符進(jìn)行講解。
算術(shù)操作符 |
移位操作符 |
位操作符 |
賦值操作符 |
單目操作符 |
關(guān)系操作符 |
邏輯操作符 |
條件操作符 |
逗號(hào)操作符 |
下標(biāo)引用、函數(shù)調(diào)用與結(jié)構(gòu)成員 |
分為+、-、*、/、%五個(gè)算術(shù)操作符,算術(shù)操作符比較簡(jiǎn)單,和我們數(shù)學(xué)中所學(xué)的相似,但是要注意的是C語(yǔ)言中的乘號(hào)為*,而不是x。
還有以下幾點(diǎn)我們要切記:
1. 除了 % 操作符之外,其他的幾個(gè)操作符可以作用于整數(shù)和浮點(diǎn)數(shù)。 2. 對(duì)于 / 操作符如果兩個(gè)操作數(shù)都為整數(shù),執(zhí)行整數(shù)除法。而只要有浮點(diǎn)數(shù)執(zhí)行的就是浮點(diǎn)數(shù)除法,即我們需要得到一個(gè)浮點(diǎn)數(shù)時(shí),我們必須控制除數(shù)或被除數(shù)至少有一個(gè)為浮點(diǎn)型。 3. % 操作符的兩個(gè)操作數(shù)必須為整數(shù)。返回的是整除之后的余數(shù)。 4.在使用 / 操作符過(guò)程中,也要記得除數(shù)不能為0。2.移位操作符
移位操作符分為:
左移位操作符<<
右移位操作符>>
移位操作符實(shí)質(zhì)上是對(duì)數(shù)字的二進(jìn)制位進(jìn)行操作,這里我們就必須帶著大家來(lái)學(xué)習(xí)一些有關(guān)二進(jìn)制的知識(shí)。
1.原碼、反碼、補(bǔ)碼原碼就是我們要進(jìn)行操作的數(shù)字轉(zhuǎn)換為2進(jìn)制后的形式,我們知道在32位操作系統(tǒng)下,一個(gè)整型為4個(gè)字節(jié),即32個(gè)比特位,一個(gè)比特位就是一個(gè)0或者1的序列,計(jì)算機(jī)通過(guò)電勢(shì)的高低來(lái)存儲(chǔ),0代表低電平,1代表高電平。
對(duì)于一個(gè)有符號(hào)類型的整數(shù)(unsigned int)來(lái)說(shuō)最高位(即最左邊的位)為符號(hào)位,1代表負(fù)號(hào),0代表正號(hào)。
所以3和-5的原碼就是:
00000000000000000000000000000011
10000000000000000000000000000101
了解了原碼之后,那么什么是反碼呢?
正數(shù)的反碼就是原碼本身,而負(fù)數(shù)的反碼就是將這個(gè)數(shù)字的符號(hào)位除外的二進(jìn)制序列按位取反之后所得到的二進(jìn)制序列,什么叫按位取反呢?按位取反就是將每個(gè)比特位上的數(shù),為0時(shí)改為1,為1時(shí)改為0。
所以3和-5的反碼為:
0000 0000 0000 0000 0000 0000 0000 0011
1111 1111 1111 1111 1111 1111 1111 1010
補(bǔ)碼也很簡(jiǎn)單,正數(shù)的補(bǔ)碼就是原碼本身,所以正數(shù)的原碼反碼補(bǔ)碼都是相同的,而負(fù)數(shù)就是在反碼的操作上加1。
所以3和-5的補(bǔ)碼為:
0000 0000 0000 0000 0000 0000 0000 0011
1111 1111 1111 1111 1111 1111 1111 1011
在我們的內(nèi)存中,存儲(chǔ)的不是原碼,而是這個(gè)數(shù)字的補(bǔ)碼。
2.左移位操作符左移位操作符就是對(duì)一個(gè)二進(jìn)制數(shù)最左邊的數(shù)舍棄,最右邊補(bǔ)0。
對(duì)數(shù)字n進(jìn)行移位操作,可以表示為n<<1,在沒(méi)有被賦值的情況下,n的值并不會(huì)發(fā)生改變,只有當(dāng)n=n<<1時(shí),n的值才會(huì)發(fā)生變化。
通俗的來(lái)說(shuō),左移操作符就是給這個(gè)數(shù)乘上2,左移幾位,就會(huì)成上2的幾次方,例如:a=3<<2,求得的值就是3*2的平方。
3.右移位操作符與左移位操作符有所不同,右移位操作符分為邏輯移位和算術(shù)移位,根據(jù)編譯器的不同,可能在進(jìn)行右移位時(shí)是邏輯移位,也可能是算術(shù)移位,邏輯移位就是將整個(gè)二進(jìn)制序列向右移動(dòng),左邊的空隙補(bǔ)上0,而算術(shù)移位則是將二進(jìn)制序列向右移動(dòng),左邊補(bǔ)上原來(lái)的符號(hào)位上的數(shù)。
以-1為例:
-1的補(bǔ)碼為:
1111?1111 1111?1111?1111?1111?1111?1111
進(jìn)行邏輯移位
0【補(bǔ)位】? ? 1111?1111 1111?1111?1111?1111?1111?111? ? ? ? 1【丟棄】
所以移位后:
0111?1111 1111?1111?1111?1111?1111?1111
進(jìn)行算術(shù)移位
1【補(bǔ)位】? ? 1111?1111 1111?1111?1111?1111?1111?111? ? ? ? 1【丟棄】
所以移位后:
1111?1111 1111?1111?1111?1111?1111?1111
所以我們?cè)谶M(jìn)行移位后,將移位后的補(bǔ)碼重新轉(zhuǎn)化為原碼,即可得到移位后的值。但是如何轉(zhuǎn)化回原碼呢?
我們知道 ,由原碼轉(zhuǎn)化為補(bǔ)碼時(shí),是通過(guò)原碼取反再加1,所以轉(zhuǎn)化回去可以先減1再取反,也可以先通過(guò)取反加1轉(zhuǎn)化回去。
轉(zhuǎn)化回去之后,我們發(fā)現(xiàn)-1算術(shù)右移1位的原碼和補(bǔ)碼相同,所以 移位后的值應(yīng)該不變,那么到底是不是這樣,我們回去驗(yàn)證一下。
int main() {
int a = -1;
int b = 0;
b = a >>1;
printf("%d %d", a, b);
return 0;
}
三、位操作符位操作符有:
& // 按位與 | // 按位或 ^ // 按位異或 注:他們的操作數(shù)必須是整數(shù)。
位操作符與移位操作符相同,都是對(duì)二進(jìn)制位進(jìn)行操作,而且操作數(shù)都必須是整數(shù)。
1.按位與&?即就是將兩個(gè)數(shù)的每個(gè)二進(jìn)制位上的數(shù)進(jìn)行判斷,如果同時(shí)為1時(shí)結(jié)果為1,其余情況都為0。
如:3和-5在內(nèi)存中存儲(chǔ)的補(bǔ)碼為:
0000 0000 0000 0000 0000 0000 0000 0011
1111 1111 1111 1111 1111 1111 1111 1011
n=3&-5的值應(yīng)該為0000 0000?0000 0000?0000 0000?0000 0011
結(jié)果為3,那么我們用代碼測(cè)試一下。
int main() {
int a = 3;
int b = -5;
int c = a & b;
printf("%d %d\n", a, b);
printf("%d", c);
return 0;
}
通過(guò)代碼來(lái)驗(yàn)證是正確的。
2、按位或 |?即就是將兩個(gè)數(shù)的每個(gè)二進(jìn)制位上的數(shù)進(jìn)行判斷,如果同時(shí)為0時(shí)結(jié)果為0,其余情況都為1。
以3和-5來(lái)舉例:
如:3和-5在內(nèi)存中存儲(chǔ)的補(bǔ)碼為:
0000 0000 0000 0000 0000 0000 0000 0011
1111 1111 1111 1111 1111 1111 1111 1011
所以n= 3 | -5 =?1111 1111 1111 1111 1111 1111 1111 1011,通過(guò)取反加1得到原碼,轉(zhuǎn)化為十進(jìn)制為-5,我們也來(lái)通過(guò)代碼驗(yàn)證一下。
int main() {
int a = 3;
int b = -5;
int c = a | b;
printf("%d %d\n", a, b);
printf("%d", c);
return 0;
}
3、異或^?即就是將兩個(gè)數(shù)的每個(gè)二進(jìn)制位上的數(shù)進(jìn)行判斷,如果相同時(shí)結(jié)果為0,不同時(shí)都為1。
以3和-5來(lái)舉例:
如:3和-5在內(nèi)存中存儲(chǔ)的補(bǔ)碼為:
0000 0000 0000 0000 0000 0000 0000 0011
1111 1111 1111 1111 1111 1111 1111 1011
n=3^-5=?1111 1111 1111 1111 1111 1111 1111 1000,轉(zhuǎn)化為原碼,轉(zhuǎn)化為十進(jìn)制后,得到n=-8.
int main() {
int a = 3;
int b = -5;
int c = a ^ b;
printf("%d %d\n", a, b);
printf("%d", c);
return 0;
}
今天我們講解了操作符中的算術(shù)操作符,位操作符,移位操作符,并且讓大家了解到了二進(jìn)制中的原碼補(bǔ)碼和反碼,讓我們對(duì)二進(jìn)制數(shù)有了一個(gè)更為深入的認(rèn)識(shí),希望通過(guò)今天的學(xué)習(xí),大家知道在內(nèi)存中數(shù)據(jù)的儲(chǔ)存形式以及幾個(gè)操作符的使用方法。?
你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機(jī)房具備T級(jí)流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級(jí)服務(wù)器適合批量采購(gòu),新人活動(dòng)首月15元起,快前往官網(wǎng)查看詳情吧