C/C++ 中的移位操作拾遺

引言

最近筆者一直在做JPEG的解碼工作,發現用完全使用哈夫曼樹進行解碼比較費時,而使用表結構存儲編碼和值的對應關係比較快捷,但是也存在比較難處理的地方,比如解碼工作通常是以位爲單位的操作,這裏必然會涉及到移位操作,而筆者之前對位的操作很少,經驗很欠缺,經過這次歷練終於發現了一個自己曾經忽視的東西,那就是C/C++中的移位操作容易出錯的情況。

1、什麼樣的數據類型可以直接移位

char、short、int、long、unsigned char、unsigned short、unsigned int、unsigned long都可以進行移位操作,而double、float、bool、long double則不可以進行移位操作。

2、有符號數據類型的移位操作

對於char、short、int、long這些有符號的數據類型:

對負數進行左移:符號位始終爲1,其他位左移
對正數進行左移:所有位左移,即 <<,可能會變成負數
對負數進行右移:取絕對值,然後右移,再取相反數
對正數進行右移:所有位右移,即 >>
3、無符號數據類型的移位操作

對於unsigned char、unsigned short、unsigned int、unsigned long這些無符號數據類型:

沒有特殊要說明的,使用<< 和 >> 操作符就OK了

結束語

8086 中存在邏輯移位、算術移位,而C/C++中的移位似乎既不是邏輯移位,也不是算術移位。

比如-1,我們若對它右移1位,C的結果仍舊是-1,事實上無論右移多少位始終是-1,邏輯移位得到的結果(8位表示)應該是-128,所以這點要注意。


本文來自CSDN博客,轉載請標明出處:http://blog.csdn.net/BoyMgl/archive/2008/07/06/2619264.aspx

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章