關於c語言中左移右移運算符的問題


  參照《c與指針》,在c語言中左移時,不論算術左移還是邏輯左移效果都是相同的。而且對於有符號和無符號類型執行相同的操作,即按照二進制位向左左移N位。例如:

1 clude <stdio.h>
2 int main()
3 {
4     int a = 0xafffffff;
5     printf("%d\n",a<<1);
6     int b = 0xff;
7     printf("%d\n",b<<1);
8 }
ubuntu@ubuntu:~/code/2017.8.28$ ./test3
1610612734
510

 

  int型變量a在內存中轉換為2進制儲存 1010 1111 1111 1111 1111 1111 1111 1111為一個負整數,b在內存中儲存為 0000 0000 0000 0000 0000 0000 1111 1111為一個正整數,程序結果如上。a左移后轉化為正整數,b轉換為正整數 ,都按2進制左移一位(包括符號位)。

  而對於右移來講,針對不同的編譯器,可能會進行算術或邏輯移位。在gcc下進行算術移位,即對於正整數右移,算數移位與邏輯移位相同,右移后左端補0,對於負整數右移,算數移位為符號位1不動,右移后左端補1。

1 #include <stdio.h>
2 int main()
3 {
4     int a = 0xafffffff;
5     printf("%d\n",a<<1);
6     int b = 0xff;
7     printf("%d\n",b<<1);
8 }
ubuntu@ubuntu:~/code/2017.8.28$ ./test3
-671088641
127

  a作為負數 右移左端補1,b作為正數右移左端補0,驗證了以上結論。

  在左移右移中,如果數據類型總位數小於int,則先轉化為int再進行移位運算。如果左移或右移位數大於數據類型位數,則先進行對數據類型位數取模,再用余數進行移位運算。

 1 #include <stdio.h>
 2 int main()
 3 {
 4     char a = 0x11;
 5     //for(i = 0;i < 100;i++)
 6     //{
 7     //    printf("%d\n", a>>i);
 8     //}
 9     printf("%d\n", a>>(sizeof(int)*8+3));
10     printf("%d\n", a>>3);
11     printf("%lu\n", sizeof(a>>3));
12     printf("%ld\n",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("%d\n", a>>(sizeof(int)*8+3));
                     ^
ubuntu@ubuntu:~/code/2017.8.27$ ./test1
2
2
4
1
ubuntu@ubuntu:~/code/2017.8.27$ 

    針對一個char型數據,當打印sizeof(a>>3)時輸出為4,說明此時a>>3這個變量為int型。而上邊對於a>>3與a>>(32+3)的輸出結果相同,同時系統警告移位大於

數據類型寬度,證明了上文結論。

 

  

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM