深入理解C語言中的移位運算

2021-06-27 02:47:20 字數 1020 閱讀 7804

深入理解c語言中的移位運算

移位運算:

c語言還提供了一組移位運算,以便向左或者向右移動位模式。對於乙個位表示為[xn-1,xn-2,…,x0]的運算元x,c表示式x《有乙個相應的右移運算x>>k,但是它的行為有點微妙。一般而言,機器支援兩種形式的右移:邏輯右移和算術右移。邏輯右移在左端補k個0,得到的結果是[0,…,0,xn-1,xn-2,…,xk]。算術右移是在左端補k個最高有效位的值,得到的結果是[xn-1,…,xn-1,xn-1,xn-2,…,xk]。這種做法看上去可能有點奇特,但是我們會發現它對有符號整數資料的運算非常有用。

讓我們來看乙個例子,下面的表給出了對某些例項8位資料做不同的移位操作得到的結果。操作值

引數x[0110 0011] [1001 0101]

x<<4

[00110000] [01010000]

x>>4(邏輯右移)

[00000110] [00001001]

x>>4(算術右移)

[00000110] [11111001]

斜體的數字表示的是最右端(左移)或最左端(右移)填充的值。可以看到除了乙個條目之外,其他的都涉及填充0。唯一的例外是算術右移[10010101]的情況。因為運算元的最高位是1,填充的值就是1。

c語言標準並沒有明確定義應該使用哪種型別的右移。對於無符號資料(也就是以限定詞unsigned宣告的整型物件),右移必須是邏輯的。而對於有符號資料(預設的宣告的整型物件),算術的或者邏輯的右移都可以。不幸的是,這就意味著任何假設一種或者另一種右移形式的**都潛在著可移植性問題。然而,實際上,幾乎所有的編譯器/機器組合都對有符號資料使用算術右移,且許多程式設計師也都假設機器會使用這種右移。

對於如何區分邏輯

右移和算術右移,

一般說來無符號整型採用邏輯右移;帶符號整型採用算術右移。

C語言中bool變數的深入理解

目錄 在一些高階語言當中,為了能夠完成更好的邏輯判斷,因此就有了bool型別,bool型別的變數值只有true和false兩種。而在c語言中,一般認為0為假,非0為真。這是因為c99之前,c90是沒有bool型別的的。但是c99引入了 bool型別 bool就是乙個型別,不過在新增標頭檔案stdbo...

深入理解C語言 深入理解指標

關於指標,其是c語言的重點,c語言學的好壞,其實就是指標學的好壞。其實指標並不複雜,學習指標,要正確的理解指標。指標也是一種變數,占有記憶體空間,用來儲存記憶體位址 指標就是告訴編譯器,開闢4個位元組的儲存空間 32位系統 無論是幾級指標都是一樣的 p操作記憶體 在指標宣告時,號表示所宣告的變數為指...

深入理解C語言 深入理解指標

關於指標,其是c語言的重點,c語言學的好壞,其實就是指標學的好壞。其實指標並不複雜,學習指標,要正確的理解指標。指標也是一種變數,占有記憶體空間,用來儲存記憶體位址 指標就是告訴編譯器,開闢4個位元組的儲存空間 32位系統 無論是幾級指標都是一樣的 p操作記憶體 在指標宣告時,號表示所宣告的變數為指...