算術移位邏輯移位

2021-09-29 11:02:55 字數 1403 閱讀 2758

unsigned int i = 8;

int main()

請問:上面的變數i是採用邏輯移位還是算術移位呢?

邏輯移位,簡單理解就是物理上按位進行的左右移動,兩頭用0進行補充,不關心數值的符號問題。

算術移位,同樣也是物理上按位進行的左右移動,兩頭用0進行補充,但必須確保符號位不改變。

邏輯移位是指邏輯左移和邏輯右移,移出的空位都用0來補。

此組指令有:邏輯左移shl(shiftlogical left)和邏輯右移shr(shiftlogical right)。它們的指令格式如下:shl/shr reg/mem, cl/imm,受影響的標誌位:cf、of、pf、sf和zf(af無定義)。邏輯左移/右移指令只有它們的移位方向不同,移位後空出的位都補0

(1)邏輯左移shl

(2)邏輯右移shr

算術移位 就需要分有符號型值和無符號型值

==對於無符號型值,算術移位等同於邏輯移位==

==而對於有符號型值 ,算術左移等同於邏輯左移,算術右移補的是符號位,正數補0,負數補1。==

算術移位指令有:算術左移sal(shiftalgebraic left)和算術右移sar(shiftalgebraic right)。它們的指令格式如下:sal/sar reg/mem, cl/imm,受影響的標誌位:cf、of、pf、sf和zf(af無定義)。算術移位指令的功能描述如下:

(1)算術左移sal把目的運算元的低位向高位移,空出的低位補0;

(2)算術右移sar把目的運算元的高位向低位移,空出的高位用最高位(符號位)填補。

在彙編指令中,shl和shr表示邏輯左移和邏輯右移,sal和sar表示算術左移和算術右移

#include int main()

讓我們來看一看這一段**的彙編**

只看彙編**進行分析:

彙編**的第四行和第七行以及第十一行是對a,b,c三個變數進行的移位操作,即有符號型變數左移和無符號型右移c編譯器都處理為邏輯移位,用的指令是shl和shr,移出的空位用0來補。

而對於彙編**的第十五行和第十九行是對d,e兩個變數進行的移位操作,即正數和負數的有符號型變數的右移,c編譯器處理為算術移位,用的指令是sar,移出的空位,正數補0,負數補1。

對於c編譯器的邏輯移位和算術移位的總結

我所使用的c編譯器是vs2008,基於該編譯器採用對無符號型int,short,char進行移位時,編譯器預設生成的彙編指令是邏輯左移和邏輯右移。

而對於有符號的int,short,char進行移位時,左移還是邏輯左移,但右移時生成的彙編指令是算術右移。

參考:

算術移位和邏輯移位

算術移位和邏輯移位 unsigned int i 8 int main 上面的變數i是採用邏輯移位還是算術移位呢?邏輯移位,簡單理解就是物理上按位進行的左右移動,兩頭用0進行補充,不關心數值的符號問題 算術移位,同樣也是物理上按位進行的左右移動,兩頭用0進行補充,但必須確保符號位不改變 但我們好奇的...

算術移位和邏輯移位

算術移位和邏輯移位 unsigned int i 8 int main 上面的變數i是採用邏輯移位還是算術移位呢?邏輯移位,簡單理解就是物理上按位進行的左右移動,兩頭用0進行補充,不關心數值的符號問題 算術移位,同樣也是物理上按位進行的左右移動,兩頭用0進行補充,但必須確保符號位不改變 但我們好奇的...

邏輯移位與算術移位

1.邏輯移位 不論是左移還是右移都是直接補0,所有位參與移位。2.算術移位 與邏輯移位的區別在於符號位不參與移位。當為雙符號位時,只有最高符號位才是真符號位,低符號位會參與移位,而如果移位後為01或10,則說明溢位。如補碼1,010 0000左移一位後為1,100 0000。當機器數為正時 無論左移...