對一個程式的思考3(移位操作之移動負數位)

來源:互聯網
上載者:User

標籤:

在c 中左移也就是所說的邏輯移位,右端補0,

而右移是算數移位,左端補齊的是最高位的符號位。(有的編譯器可能右移也是邏輯移位,但道理是一樣的),這裡以右移部符號位為準。


故負數左移,有可能變成正數,但負數右移,肯定還是負數。


/********************************************************************** * yiwei.cpp  *Compiler: GCC,VS,VC6.0  win32 *Author:WK * Last Update:  Sun 29 March 2015 10:21:44 AM CST ************************************************************************/#include <stdio.h>int main(int argc, char **argv){           int i = -9,j=9;    printf("-9儲存形式: %d %x\n", i, i);     printf(" 9儲存形式:  %d %x\n", j, j);    int i1 = i >> 3;int i2=i<<3;    printf("-9右移3位:   %d %x\n", i1, i1); printf("-9左移3位:   %d %x\n", i2, i2);int j1=j >> 3;  int j2=j<<3;    printf(" 9右移3位:    %d %x\n", j1, j1); printf(" 9左移3位:    %d %x\n", j2, j2);int i3 = i >> 33;int i4=i<<33;    printf("-9右移33位:   %d %x\n", i3, i3); printf("-9左移33位:   %d %x\n", i4, i4);int j3=j >> 33;  int j4=j<<33;    printf(" 9右移33位:    %d %x\n", j3, j3); printf(" 9左移33位:    %d %x\n", j4, j4);int i5 = i >> -3;int i6=i<<-3;    printf("-9右移-3位:   %d %x\n", i5, i5); printf("-9左移-3位:   %d %x\n", i6, i6);int j5=j >> -3;  int j6=j<<-3;    printf(" 9右移-3位:    %d %x\n", j5, j5); printf(" 9左移-3位:    %d %x\n", j6, j6);int i7 = i >> -33;int i8=i<<-33;    printf("-9右移-33位:   %d %x\n", i7, i7); printf("-9左移-33位:   %d %x\n", i8, i8);int j7=j >> -33;  int j8=j<<-33;    printf(" 9右移-33位:    %d %x\n", j7, j7); printf(" 9左移-33位:    %d %x\n", j8, j8);    return 0;}

運行結果是:


首先,我在這裡給出的極端數字有在int 只有32位的情況下移動33位和-33,我沒有給出移動3000位移動-3000位或個多,因為我認為這個移動33位和-33位已經足夠代表這種情況,下來我們就分析一下結果的原因

  

我開始猜測編譯器中右 i=n%32 程式會將大數字轉化在32位平台的32位可移動範圍內(我們這裡的移動在int 所能表示的範圍內)

於是進行了以下測試:

#include <stdio.h>int main(int argc, char **argv){           int i = -9;    printf("-9儲存形式: %d %x\n", i, i);  printf("\n\n");   int i3 = i >> 33;int i4=i>>1;    printf("-9右移33位:   %d %x\n", i3, i3); printf("-9右移1 位:   %d %x\n", i4, i4);printf("\n\n");int i5 = i >> -1;//-1的補碼形式:11111111 111111111 11111111 11111111int i6=i>>63;//63二進位:00000000 00000000 00000000 00011111int i7=i>>31;    printf("-9右移-1位:   %d %x\n", i5, i5); printf("-9右移63位:   %d %x\n", i6, i6);printf("-9右移31位:   %d %x\n", i7, i7);printf("\n\n");    int i8 = i >> -33;//-33補碼儲存:11111111 11111111 11111111 11011111int i9 = i >> -1;int i10= i >> 63;    printf("-9右移-33位:   %d %x\n", i9, i9); printf("-9左移-1 位:   %d %x\n", i9, i9);printf("-9左移63 位:   %d %x\n", i10, i10);    return 0;}

結果如下:

又進行了測試:

/********************************************************************** * yiwei.cpp  *Compiler: GCC,VS,VC6.0 *Author:WK ************************************************************************/#include <stdio.h>int main(int argc, char **argv){           int i = 9;    printf("9儲存形式: %d %x\n", i, i);  printf("\n\n");   int i3 = i >> 33;int i4=i>>1;    printf("9右移33位:   %d %x\n", i3, i3); printf("9右移1 位:   %d %x\n", i4, i4);printf("\n\n");int i5 = i >> -1;//-1的補碼形式:11111111 111111111 11111111 11111111int i6=i>>63;//63二進位:00000000 00000000 00000000 00011111int i7=i>>31;    printf("9右移-1位:   %d %x\n", i5, i5); printf("9右移63位:   %d %x\n", i6, i6);printf("9右移31位:   %d %x\n", i7, i7);printf("\n\n");    int i8 = i >> -33;//-33補碼儲存:11111111 11111111 11111111 11011111int i9 = i >> -1;int i10= i >> 63;    printf("9右移-33位:   %d %x\n", i9, i9); printf("9左移-1 位:   %d %x\n", i9, i9);printf("9左移63 位:   %d %x\n", i10, i10);    return 0;}

於是我進行了如下分析:





  於是我得出了一個結論: 1.當所要移動的位元(左移右邊補零,右移左邊補符號位)在0----32位時候就進行正常的移位,因為在int 型小於32位不會超出位元範圍

                                            2.當所要移動的位元大於32時候就進行取餘32 就會轉化為小於32位的數字,進行移位

                                            3.當要移動的位元是負數的時候,就取負數補碼(因為負數是在記憶體中以補碼形式儲存的)的後邊5位(在32位平台上取5位,64位平台上邊取6位,具體原因請參考彙編代碼和電腦群組成原理相關知識,我不多解釋),後邊5位二進位按無符號解析,如果大於32就按照步驟二進行取餘32,如果小於32就進行1步驟進行移位。

(如果有以上結論有錯誤,歡迎大家指正!謝謝!)

對一個程式的思考3(移位操作之移動負數位)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.