今天在學(xué)習(xí)移位運(yùn)算符和取反運(yùn)算符的時(shí)候,發(fā)現(xiàn)一些問(wèn)題!現(xiàn)在呢在這里說(shuō)一下自己的感悟!
先看下面一道 取反和移位相結(jié)合的問(wèn)題
#include<stdio.h>
int main()
{
char a=0x11;
char b;
b=~a<<2;
printf("%d\n",b);
b=~(a<<2);
printf("%d\n",b);
b=~a>>2;
printf("%d\n",b);
b=~(a>>2);
printf("%d\n",b);
return 0;
}
輸出結(jié)果是:
-72
-69
-5
-5
剛開(kāi)始在想為什么相同的操作(只是移位方向不同),為什么上面兩個(gè)結(jié)果不一樣,而下面兩個(gè)結(jié)果卻是一樣的呢。有些人在疑問(wèn)是不是因?yàn)橄旅鎯蓚€(gè)表達(dá)式都是先移位后取反的呢?我可以肯定不是這樣的,但是不能解釋這個(gè)結(jié)果。這個(gè)問(wèn)題我糾結(jié)了半天! 不過(guò)對(duì)下面的知識(shí)了解之后便豁然開(kāi)朗了。
移位運(yùn)算符分為左移運(yùn)算符和右移運(yùn)算符。
當(dāng)對(duì)一個(gè)數(shù)執(zhí)行左移運(yùn)算的時(shí)候,右邊的空位是用0補(bǔ)齊。
而當(dāng)對(duì)一個(gè)數(shù)執(zhí)行右移運(yùn)算的時(shí)候,左邊的空位是用符號(hào)位補(bǔ)齊的(這是我之前沒(méi)注意的地方,慚愧)。
解體步驟如下:
a=0x11=0001 0001
~a=1110 1110
a<<2=0100 0100
a>>2=0000 0100
~a<<2=1011 1000
現(xiàn)在 1011 1000是補(bǔ)碼,轉(zhuǎn)化成原碼之后是
1100 1000=-72 -72是十進(jìn)制
~(a<<2)=0100 0100
轉(zhuǎn)化為原碼之后是 1100 0101=-69
~a>>2=1111 1011(注意現(xiàn)在是用1補(bǔ)齊的,因?yàn)閪a的符號(hào)位是1)
轉(zhuǎn)化為原碼之后是 1000 0101=-5
~(a>>2)=1111 1011
轉(zhuǎn)化為原碼之后是 1000 0101=-5
明白之后心情很好,所以在這里分享一下。呵呵