C c 中移位與負數表達的一點研究

2021-06-21 02:57:18 字數 748 閱讀 5925

最近在專案開發過程中,遇到一些移位問題和有符號無符號轉換時的表達問題,造成了種種的困惑。所以,個人抽出一點時間與之做了個徹底的了斷。廢話少說。切入正題.

來看一下**:

int _tmain(int argc, _tchar* argv)

你能說出每一步的value的值嗎?

筆者之前一直認為,移位操作,左移就是將位左移,右補0;右移就是將位右移,左補零.(其中涉及算數移位與邏輯移位)。邏輯移位就是不考慮符號位,而算術移位需要考慮符號位.但是在將char左移32位時,預想的結果為0,但實際上是0x13.發生了迴圈移位,其並未丟掉移除的位進行補零操作。這與編譯器有關嗎?往達人指點.

總結幾點:(1)移位操作 若不強制設定型別 預設為int  上例中會將ch轉換為int

(2)移位過程中 若超出了int的範圍 例如移位32為 則會發生迴圈移位 目前不確定是否與編譯器有關

(3)有時根據需要需要考慮算術與邏輯移位操作

以上是移位  再看下面的負數表達問題

int _tmain(int argc, _tchar* argv)

其中 ch << 62位後 其值為0xc0000000  由於是按照int解析 所以其值 = -0x4000000  該值賦予__int64時 最高符號位為1 求反碼後+1 最終得到0xffffffffc0000000;

l_value與l_value_0的值是相等的.

C C 中的移位操作

1 什麼樣的資料型別可以直接移位 char short int long unsigned char unsigned short unsigned int unsigned long都可以進行移位操作,而double float bool long double則不可以進行移位操作。2 有符號資料...

對計算機中負數表示的思考

我們都知道計算機中負數用補碼表示,即 取反 加1,那為什麼這麼蛋疼的表示呢,既然要區分正負數,直接用最高位來區分不就行了嗎?仔細思考了下,負數用補碼表示是為了實現加法和減法的統一 更確切說就是為了實現減法 設要表示的整數 i 由 b 位儲存,那麼 i 2 b 1。下面討論均是整數。設有一正整數i1,...

關於二進位制的負數怎麼表示與移位運算

對於正數的二進位制,應該沒有疑問,比如 以8位系統來分析,第一位為符號位 1的二進位制表示為00000001。而對於負數來說,就比較麻煩,比如 1。有人說是10000001,而有人說是11111111。其實這兩種說法都沒錯,這是分類方法的差異。在一些把二進位制分為原碼 反碼 補碼的體系中 注 當然對...