VC 6 0 移位操作

2021-06-30 16:53:59 字數 2162 閱讀 9683

本文記錄一下vc++6.0中c

語言下的移位操作,主要考慮會不會溢位,以及符號位的處理。首先區別一下算術移位與邏輯移位:

*算術左移同邏輯左移

*算術右移高位補符號位

*邏輯右移高位補0

1、左移操作 《結論為:高位移出,低位補0>

1)無符號數 

我們考慮乙個特別的數:

2147483647

,恩,這個數很特別不用懷疑,

2147483647

是#include

標頭檔案中定義的

int_max

,即整型有符號數的最大值。其二進位制形式為:

01111111 11111111 11111111 11111111

令unsigned a = 

2147483647, 

左移兩位後的結果為:11111111 11111111 11111111 11111100,可以通過執行以下**驗證,

int i;

unsigned a = 2147483647;

unsigned b;

printf("%u\n",a<<2);

printf("%u\n",a*4);

b = a*4;

for(i=1;i<=32;i++)

2)正數,有符號數 

我們令a = 2147483647

,二進位制:01111111 11111111 11111111 11111111,然後檢視左移一位後的結果,即執行下面語句:

a = int_max;

printf("%d ",a<<1);

printf("%d\n",a*2);

//輸出結果為-2 -2

a由正數變成了負數,由此可見

發生了溢位。所以a此時的操作位去掉前面要移動的位數,不關心符號位,並在最右邊補0,a在移位後的結果為:

11111111 11111111 11111111 111111110

有符號數在計算機中是以補碼表示的,轉換為原碼為(第一位為符號位):

10000000 00000000 00000000 00000010

即為-2;

3)負數,有符號數

令a = -2147483647;即二進位制編碼(補碼)為:

10000000 00000000 00000000 00000001

現在將a左移1位,得到的結果為2,由此可見移位操作為將高位移出,低位補0,移位後的結果為:

00000000 00000000 00000000 00000010

2、右移操作  

1)無符號數 《邏輯右移,高位補0>

我們令a = 4294967295,這個也是個很特別的數,是#include中定義的uint_max,即無符號數最大數,二進位制為:

11111111 11111111 11111111 11111111

現在,我們將a右移一位,並檢視結果,結果為2147483647,這個數是不是很熟悉?即int_max,所以右移的操作為高位補0,結果為:

01111111 11111111 11111111 11111111

2)有符號數,正數 《算術右移,高位補符號位》

令a = int_max,即01111111 11111111 11111111 11111111,右移一位後結果為:

00111111 11111111 11111111 11111111,顯然,操作是高位補0

3)有符號數,負數 《算術右移,高位補符號位》

令a = -1,即:11111111 11111111 11111111 11111111,我們檢視右移一位後的結果,執行下面命令:

int a = -1;

printf("%d ",a>>1);

int b = -2;

printf("%d\n",b>>1);

//輸出 -1 -1

我們可以看到-1,-2右移一位的結果都是-1,-1右移一位得-1好解釋,-2也好解釋,-2的二進位制為

11111111 11111111 11111111 11111110

右移後得11111111 11111111 11111111 11111111,即-1。

3、總結

vc++6.0可以認為都進行的是算術移位。

vc6 0 除錯小結

現在都用vs2008了,vc6的速度還是很懷念,來個小結吧。斷點相關快捷鍵 1.f9在當前游標所在的行下斷點,如果當前行已經有斷點,則取消斷點.f5除錯狀態執行程式,程式執行到有斷點的地方會停下來.f10單步執行程式.ctrl f10執行到游標所在行.f11和f10的區別是,如果當前執行語句是函式呼...

VC 6 0遠端除錯

先明確下概念,遠端除錯嘛,自然是兩個機器之間除錯。程式執行在目標機器上,偵錯程式執行在本機。當然,目標機器上還是要有少許輔助程式才能跟本機的偵錯程式connect上,以便通訊。一般來說,只需要copy四個檔案到目標機器上就行了 msvcmon.exe dm.dll tln0t.dll和msdis11...

vc6 0記憶體洩露

新建記憶體洩露定位類cmemleaks,所有的檔案都需要包含memleaks.h檔案,故而將其放置在stdafx.h檔案中。cpp檔案如下 memleaks.cpp implementation of the cmemleaks class.include stdafx.h include meml...