邏輯移位,簡單理解就是物理上按位進行的左右移動,兩頭用0進行補充,不關心數值的符號問題。
算術移位,同樣也是物理上按位進行的左右移動,兩頭用0進行補充,但必須確保符號位不改變。
算術移位指令
算術移位指令有:算術左移sal(shiftalgebraic 程式設計客棧left)和算術右移sar(shiftalgebraic right)。算術移位指令的功能描述如下:
(1)算術左移sawww.cppcns.coml把目的運算元的低位向高位移,空出的低位補0;
(2)算術右移sar把目的操www.cppcns.com作數的高位向低位移,空出的高位用最高位(符號位)填補。
邏輯移位指令
此組指令有:邏輯左移shl(shiftlogical left)和邏輯右移shr(shiftlogical right)。邏輯左移/右移指令只有它snbfoke們的移位方向不同,移位後空出的位都補0。
結論:不管是否有無符號型別,也不管值的正負,均採用的是邏輯左移。
結論:說明只要是有符號數,不管值是正還是負,右移時採用的都是算術右移。
疑問:按照移位補0的原則,為何左移都是邏輯移位呢?
答疑:先看看「-8」和「8」在計算機記憶體中的值分別是:
0xfffffff8
0x8由於計算機均按補碼儲存數值,所以不管符號正負,左移對於符號位並不產生影響,而右移則就不同了,無符號數怎麼右移都不影響符號位,但是有符號數邏輯右移時高位補0將改變符號位,所以只能採用算術右移。
C語言左移右移
記錄一下今天的收貨。看下面乙個程式 unit16 t index unit32 t ucrxmsgdata 4 unit16 t data0 canaregs.can if2data.bit.data 0 提取標誌位 if data0 0x7e 判斷標誌位 7e unit32 t result 0 ...
c語言負數左移右移 C語言中的左移與右移
先說左移,左移就是把乙個數的所有位都向左移動若干位,在c中用 i i 2 把i裡的值左移2位也就是說,1的2進製是000.0001 這裡1前面0的個數和int的位數有關,32位機器,gcc裡有31個0 左移2位之後變成000.0100,也就是10進製的4,所以說左移1位相當於乘以2,那麼左移n位就是...
c語言中的左移和右移
先說左移,左移就是把乙個數的所有位都向左移動若干位,在c中用 運算子.例如 int i 1 i i 2 把i裡的值左移2位 也就是說,1的2進製是000.0001 這裡1前面0的個數和int的位數有關,32位機器,gcc裡有31個0 左移2位之後變成 000.0100,也就是10進製的4,所以說左移...