【學習筆記】C語言中的移位操作


在看CMU的深入理解計算機系統課程,打算對其中對於移位操作的講解進行一個總結。
C語言中存在無符號數與有符號數的區別,但是在進行右移操作時,不管是有符號數還是無符號數都只使用>>,像Java中就不存在無符號數,如果想進行邏輯右移則使用>>>,算術右移則是>>。因此,需要弄清楚C語言當中的右移操作中邏輯右移和算術右移出現的場合,才不至於寫出錯誤的代碼。
左移很容易,向左移動多少位則丟棄左邊相應的位數,並在右側補0。
對於右移,由於最左側的一位被用於當作符號位,因此右移有兩種情況:

  1. 邏輯右移:不管符號位是什么,直接在左邊補0
  2. 算術右移:在左邊補上與符號位相同的數字

C語言實際上並沒有明確定義對於有符號數應該使用哪種右移,但是幾乎所有的編譯器/機器都會對有符號數進行算術右移,而對於無符號數,必須是邏輯右移。
總結一下就是:在C語言中,左移操作均是在右側補0;對於右移操作,有符號數一般是算術右移,無符號數則是邏輯右移。

在了解了C語言中的移位操作之后,需要面臨的另一個問題就是,如果移位操作的位數大於等於數字實際的位數會發生什么情況。
C語言的標准中並沒有說明這種情況,但是在大多數機器上,如果要移動k位,k>=w(數字的最大位數),實際上的位移量是k mod w。但是這種行為對於C語言來說是無法保證的,因此盡量不要進行這種移位操作數大於數字位數的行為,但是像在Java中,這種位移數的要求是可以得到保證的。

最后是關於C語言中,移位運算符的優先級問題,移位運算符的優先級是低於+/-符號的,比如對於1 >> 2+3 >> 4,實際上的運算順序是1 >> (2 + 3) >> 4。對於只有移位運算符的式子,則是從左至右結合。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM