本文記錄一下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...