c语言左移15位,关于c语言中左移右移运算符的问题
參照《c與指針》,在c語(yǔ)言中左移時(shí),不論算術(shù)左移還是邏輯左移效果都是相同的。而且對(duì)于有符號(hào)和無(wú)符號(hào)類(lèi)型執(zhí)行相同的操作,即按照二進(jìn)制位向左左移N位。例如:
1 clude
2 intmain()3 {4 int a = 0xafffffff;5 printf("%dn",a<<1);6 int b = 0xff;7 printf("%dn",b<<1);8 }
ubuntu@ubuntu:~/code/2017.8.28$ ./test31610612734
510
int型變量a在內(nèi)存中轉(zhuǎn)換為2進(jìn)制儲(chǔ)存 1010 1111 1111 1111 1111 1111 1111 1111為一個(gè)負(fù)整數(shù),b在內(nèi)存中儲(chǔ)存為 0000 0000 0000 0000 0000 0000 1111 1111為一個(gè)正整數(shù),程序結(jié)果如上。a左移后轉(zhuǎn)化為正整數(shù),b轉(zhuǎn)換為正整數(shù) ,都按2進(jìn)制左移一位(包括符號(hào)位)。
而對(duì)于右移來(lái)講,針對(duì)不同的編譯器,可能會(huì)進(jìn)行算術(shù)或邏輯移位。在gcc下進(jìn)行算術(shù)移位,即對(duì)于正整數(shù)右移,算數(shù)移位與邏輯移位相同,右移后左端補(bǔ)0,對(duì)于負(fù)整數(shù)右移,算數(shù)移位為符號(hào)位1不動(dòng),右移后左端補(bǔ)1。
1 #include
2 intmain()3 {4 int a = 0xafffffff;5 printf("%dn",a<<1);6 int b = 0xff;7 printf("%dn",b<<1);8 }
ubuntu@ubuntu:~/code/2017.8.28$ ./test3-671088641
127
a作為負(fù)數(shù) 右移左端補(bǔ)1,b作為正數(shù)右移左端補(bǔ)0,驗(yàn)證了以上結(jié)論。
在左移右移中,如果數(shù)據(jù)類(lèi)型總位數(shù)小于int,則先轉(zhuǎn)化為int再進(jìn)行移位運(yùn)算。如果左移或右移位數(shù)大于數(shù)據(jù)類(lèi)型位數(shù),則先進(jìn)行對(duì)數(shù)據(jù)類(lèi)型位數(shù)取模,再用余數(shù)進(jìn)行移位運(yùn)算。
1 #include
2 intmain()3 {4 char a = 0x11;5 //for(i = 0;i < 100;i++)6 //{7 //printf("%dn", a>>i);8 //}
9 printf("%dn", a>>(sizeof(int)*8+3));10 printf("%dn", a>>3);11 printf("%lun", sizeof(a>>3));12 printf("%ldn",sizeof(a)) ;13 }
ubuntu@ubuntu:~/code/2017.8.27$ gcc -o test1 test1.c
test1.c: In function ‘main’:
test1.c:9:21: warning: right shift count >= width of type [-Wshift-count-overflow]
printf("%dn", a>>(sizeof(int)*8+3));^ubuntu@ubuntu:~/code/2017.8.27$ ./test12
2
4
1ubuntu@ubuntu:~/code/2017.8.27$
針對(duì)一個(gè)char型數(shù)據(jù),當(dāng)打印sizeof(a>>3)時(shí)輸出為4,說(shuō)明此時(shí)a>>3這個(gè)變量為int型。而上邊對(duì)于a>>3與a>>(32+3)的輸出結(jié)果相同,同時(shí)系統(tǒng)警告移位大于
數(shù)據(jù)類(lèi)型寬度,證明了上文結(jié)論。
內(nèi)容來(lái)源于網(wǎng)絡(luò)如有侵權(quán)請(qǐng)私信刪除
總結(jié)
以上是生活随笔為你收集整理的c语言左移15位,关于c语言中左移右移运算符的问题的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: sqlite3 c语言编程,SQLite
- 下一篇: c语言多进程架构改go语言,golang