单片机学习--c语言中的右移位运算
移位操作:簡單的把一個值的位向左或向右移動。在左移過程中,值最左邊的幾位被丟棄,右邊多出來的幾個空位則由0補齊。
右移操作:卻面臨著一個左移操作沒有的問題。從左邊移入新值時,可以選擇兩種方案
1、邏輯移位,左邊移入的用0填充。
2、算術移位,左邊移入的位由原先該值的符號位決定,符號位為1則填充1,符號位為0則填充0
原值:10010110 邏輯移位後:00100101 算術移位:11100101
举个更具体的例子 -3>>1结果
原码 1000 0011 反码 1111 1100 补码 1111 1101 这里就有两个选择:逻辑移位: 0111 1110(126) 算术移位: 1111 1110 (-2) 一般计算机也都是用算术移位,但你怎么就知道你不会遇到特殊的
warning:無符號值的所有移位操作,都是邏輯移位。對於有符號值得移位操作採用哪種方法,就要根據你所使用得編譯器來解決。一個程序如果出現了有符號數得右移操作,它就是不可移植的。
a<<-5不是表示右移5位。在某個機器上,這個表達式實際執行了左移27位的操作。
對於這些未定義| 移位的操作比操作的位數還要多的情況, 具體效果都是根據編譯器來定的。它們的結果也很可能不可預測。所以應該避免使用這種操作
+0和+0的補碼都是0000 0000B 為了充分利用計算機資源認為規定:-0的補碼代表128 故8位二進制補碼的表示範圍時 1000 0000B - 0111 1111B (+128-+127)