首先看以下一段代碼:
1 #include <cstdio>
2
3 int main()
4 {
5 unsigned char t = 0xa5;
6 unsigned char i = (~t)>>4;
7 printf("%x\n", i);
8 return 0;
9 }
建議最好仔細(xì)先想一下再往下看
對(duì)于char、bool、unsigned char等低于int字節(jié)數(shù)的類型,進(jìn)行運(yùn)算的時(shí)候首先進(jìn)行提升,因此在進(jìn)行~t運(yùn)算之前,先要將其放入32位寄存器,由于是unsigned char,因此前面補(bǔ)位全補(bǔ)0,因此0xa5-->0x000000a5,然后取反為0xffffff5a,然后再向右移四位為0xfffffff5,然后再轉(zhuǎn)化為unsigned char型的0xf5賦值給i,因此最后輸出結(jié)果為0xf5
再看下面這段代碼:
1 #include <cstdio>
2
3 int main()
4 {
5 char t = 0xa5;
6 char i = (~t)>>4;
7 printf("%x\n", i);
8 return 0;
9 }
思想和上面的完全相同,還是先提升為int然后再進(jìn)行運(yùn)算,但是注意這里是char型,因此提升的時(shí)候應(yīng)該是根據(jù)最高位進(jìn)行提升,最高位為1則前面全補(bǔ)全為1,否則全補(bǔ)全為0。因此再進(jìn)行~t操作前應(yīng)該先補(bǔ)全為0xffffffa5,然后進(jìn)行取反操作為0x0000005a,然后再右移四位為0x00000005,再轉(zhuǎn)化成char型的0x05賦值給i,因此最后結(jié)果為0x5
再看最后一個(gè)例子:
1 #include <cstdio>
2
3 int main()
4 {
5 char a = 0x80;
6 char b = 0x2;
7 unsigned char c = 0x80;
8 unsigned char d = 0x2;
9 printf("%x\n", a / b);
10 printf("%x\n", c / d);
11 return 0;
12 }
13
主要是鞏固前面說(shuō)過(guò)的情況,非常類似,進(jìn)行運(yùn)算之前,a、b、c、d都要先補(bǔ)齊為:
a--->0xffffff80
b--->0x00000002
c--->0x00000080
d--->0x00000002
然后再進(jìn)行運(yùn)算,因此結(jié)果為:
0xffffffc0
0x40
最后再總結(jié)一下:unsigned char、char、bool等低于int型的類型,進(jìn)行運(yùn)算的時(shí)候都要先提升再運(yùn)算,提升時(shí)根據(jù)signed和unsigned,在前面補(bǔ)位為0或者1,若是unsigned,則直接前面全補(bǔ)0;若為signed,則根據(jù)最高位為0還是1,若為0則全部補(bǔ)位為0,若為1則全部補(bǔ)位為1。
posted on 2011-04-07 01:26
myjfm 閱讀(3458)
評(píng)論(16) 編輯 收藏 引用 所屬分類:
c/c++基礎(chǔ)