邏輯位移是移動數字的全部物理比特位。java
算數位移是對數字除了符號位之外的比特位進行位移,符號位保持不變。this
當具體到以二進制補碼錶示的負數的方式上,算數位移的表現形式就是在最高位補1.
固然你尚未學到二進制補碼。立刻就快了。code
若是負數的表示形式不是二進制補碼(這不多見),那算數位移就不必定是在最高位補1.orm
在彙編層面上,算數位移和邏輯位移是兩條不一樣的指令。
在java語言中,使用>>>表示邏輯位移,使用>>表示算數位移,因此即便是有符號數,也能夠作邏輯位移。
在C語言中,只有>>表示位移。對於有符號數,一般(但不是絕對)使用的是算數位移。ci
「無符號數就是邏輯,有符號數就是算數」,這個推論是不嚴謹的。雖然絕大多數狀況下是正確的。it
「The C standard does not precisely define which type of right shift should be used. For unsigned data (i.e.,
integral objects declared with the qualifier unsigned), right shifts must be logical. For signed data (the
default), either arithmetic or logical shifts may be used. This unfortunately means that any code assuming
one form or the other will potentially encounter portability problems. In practice, however, almost all
compiler/machine combinations use arithmetic right shifts for signed data, and many programmers assume
this to be the case."io
CSAPP 2.1.10裏面清楚的寫了。form
For signed data (the default), either arithmetic or logical shifts may be used.sed
看完書,不等於看懂書。一本CSAPP你能半年學透了都是很不錯的成績了。object