C語言的低階運算

2021-07-04 19:10:45 字數 2556 閱讀 5972

低階運算對於編寫系統程式、加密程式、圖形程式等需要高執行速度或高效地使用空間的程式非常有用。

按位運算子訪問單個位或位域,用於對整數或字元進行按位運算。c語言共提供了6個按位運算子。

符號含義

<<左移位

>>右移位

~按位求反

&按位與

^按位異或

|按位或

左移位和右移位運算子統稱作移位運算子。移位運算子是二元運算子,使用形式為:

運算元 >>(或<
移位運算子的運算元是整型和字元型的。左移位運算子將運算元的位向左移動,最左邊的位溢位,最右邊的位補0。右移位運算子將運算元的位向右移動,最右邊的位溢位,如果運算元為無符號整數或非負值,則最左邊的位補0,如果運算元為負值,則補0或補1由實現決定。因此考慮可移植性,只對無符號數進行移位運算。移位運算子並不改變運算元,可以與賦值運算子一起組合成復合運算子>>=<<=。移動運算子的優先順序比算術運算子低。

按位求反運算子是一元運算子,它的使用形式為:

~運算元
對運算元的每乙個取反,將每乙個0替換為1,將每乙個1替換為0。按位與運算子&對兩個運算元相應的位進行邏輯與操作,按位異或運算子&和按位或運算子|分別對兩個運算元相應的位進行邏輯異或操作和邏輯或操作。運算子~&^的優先順序高於|運算子,但是它們的優先順序都低於關係運算子。&^|可以和賦值運算子=一起組成復合賦值運算子&=, ^=, |=

運算元1 & 運算元2

運算元1 | 運算元2

運算元1 ^ 運算元2

按位運算子的常見應用包括設定位(使該位值為1)、將位清零、測試位(測試是否該位值為1)、修改位域和獲取位域等。

定義資料型別時,可以在每個成員的後面指定該成員所佔位的長度,如以下形式:

struct

每乙個成員都是整個結構體型別變數的乙個位域,位數表示其占用位的個數。位域的型別必須是int,unsigned intsigned int。但是由於使用int型時不同編譯器對最高位的處理不同,為了可移植性的考慮,將所有位域宣告為unsigned intsigned int

使用按位運算子往往可以達到和在結構體中使用位域的方法更快,但是從可讀性上來說,結構體使用位域的方法更易讀。位域可能是乙個位元組的一部分或跨越多個位元組,因此沒有位址的概念,不能為位域使用取位址符。

記憶體單元是計算機按字劃分的儲存單位,大小因計算機不同而不同,有8位,16位,32位和64位等。當編譯器處理結構體型別變數的宣告時,將位域逐個存放在記憶體單元中,直到剩下的空間不能夠在存放下乙個位域。這時,一些編譯器會跳到下一儲存單元繼續存放,而另一些則會將位域拆開跨儲存單元儲存。具體的實現方式和位域在記憶體單元的存放順序是由實現定義的。

c語言允許忽略位域的名稱,未命名的位域用作對字段間的填充,以保證其他位域儲存在適當的位置。另外指定位數為0的位域可以通知編譯器將下乙個位域放置在下乙個儲存單元的起始位置。

字元占用乙個位元組,有時將字元當作是位元組儲存一些並不一定是字元形式的資料,這時候最好定義byte型別或word型別:

typedef unsigned char byte;

typedef unsigned int word;

另外,可以通過將乙個整數強制轉換為指標就可以構建乙個指向某個特定的位址的指標。對於由段位址和基位址表示的實模式,可以通過非標準頭提供的巨集例如doc.h中的mk_fp巨集構建乙個包含特定位址的指標。

/*************************************

* bit_operator.c *

* *

* c語言中的位操作 *

k.n. king 著,呂秀峰 譯. c語言程式設計-現代方法. 人民郵電出版社

c語言資料型別高低階

若參與運算量的型別不同,則先轉換成同一型別,然後進行運算。轉換按資料長度增加的方向進行,以保證精度不降低。如int型和long型運算時,先把int量轉成long型後再進行運算。a.若兩種型別的位元組數不同,轉換成位元組數高的型別 b.若兩種型別的位元組數相同,且一種有符號,一種無符號,則轉換成無符號...

C 低階錯誤

1.陣列下標訪問越界 2.使用野指標 3.記憶體拷貝忽略字串結尾標誌 0 4.判斷無符號數是否小於0 5.迴圈變數資料型別太小 6.迴圈體內改寫迴圈變數 7.混淆 與 8.函式區域性變數或引數過大,堆疊溢位 9.資料型別不一致,變數或引數賦值出錯 10.分支流程未釋放動態申請的記憶體 案例 1 陣列...

C語言指標的運算

指標的運算實質是位址的運算。c語言有一套適用於指標 陣列等位址運算的規則,正是這套規則賦予了c語言出色的處理能力。對於指標指向變數,能進行基型別資料所能進行的全部運算。1 引用運算 1 取位址運算 取位址運算 我們已非常熟悉。對指標變數進行取位址運算,可以得到指標變數本身的位址。2 取內容運算 取內...