首頁 後端開發 C#.Net教程 C語言 位段的詳細介紹

C語言 位段的詳細介紹

Dec 12, 2016 pm 02:33 PM

C語言中的位段

      位段(bit-field)是以位元為單位定義結構體(或聯合體)中的成員變數所佔的空間。含有位段的結構體(聯合體)稱為位段結構。採用位段結構既能夠節省空間,又方便操作。

     位元段的定義格式為:

     type  [var]: digits

     int三種型別(int型能不能表示負數視編譯器而定,例如VC中int就預設為signed int,能夠表示負數)。位段名稱var是可選參數,即可以省略。 digits表示該位元段所佔的二進位位元數。

   那麼定義一個位段結構可以像下面這段程式碼去定義:

struct node 
{   unsigned int a:4;   //位段a,占4位  
    unsigned int :0;   //无名位段,占0位   
    unsigned int b:4;   //位段b,占4位   
    int c:32;       //位段c,占32位   
    int :6;       //无名位段,占6位 
    };
登入後複製

一.位段的使用

    使用位段需注意一下幾點:

 unsigned int,signed int三種類型,不能是char型或浮點型;

    2)位段佔的二進位位數不能超過該基本型別所能表示的最大位數,例如VC中int佔4位元組,那麼最多只能是32位元;

    3)無名位段不能被訪問,但是會佔據空間;

    4)不能對位元段進行取位址操作;

    4)不能對位元段進行取位址操作;

    4)不能對位元段進行取位址操作;

    4)不能對位元組進行取位址操作;

    4)不能對位元組進行取位址操作;

    4)不能對位元組進行取位址操作;

    4)不能對位元進行擷取位址 5)若位段佔的二進位位數為0,則這個位段必須是無名位段,下一個位段從下一個位段存儲單元(這裡的位段存儲單元經測試在VC環境下是4個位元組)開始存放;

    6)若位段出現在表達式中,則會自動進行整數升級,自動轉換為int型或unsigned int。

    7)當位段賦值時,最好不要超過位元段所能表示的最大範圍,否則可能會造成意想不到的結果。

    8)位元段不能出現陣列的形式。

二.位段結構在記憶體中的儲存方式

    位元段結構,編譯器會自動進行儲存空間的最佳化,主要有這幾個原則:

   1)如果一個位段儲存單元能夠儲存得下位段結構中的所有成員,那麼位段結構中的所有成員只能放在一個位段儲存單元中,不能放在兩個位段儲存單元中;如果一個位段儲存單元無法容納下位段結構中的所有成員,那麼從剩餘的位元段從下一個位元段儲存單元開始存放。 (在VC中位段儲存單元的大小是4位元組).

   2)如果一個位元段結構中只有一個佔有0位元的無名位元段,則只佔1或0位元組的空間(C語言中是佔0位元組,而C++中佔1位元組);否則其他任何情況下,一個位段結構所佔的空間至少是一個位段存儲單元的大小;

  測試程序:

/*测试位段 201110.12*/ 
#include<iostream> 
using namespace std;    
typedef struct node 
{   
unsigned int a:1;   //存在一个非0位的位段,则至少占4Byte  
}S;    
typedef struct node1    //在C++中占1字节的空间 ,在C中占0字节  
{   
unsigned int :0; 
}S1;   
typedef struct node2 
{   
unsigned int a:1;   
unsigned int :0;   //下一个位段放在一个新的位段存储单元 ,所以占4+4=8Byte    
unsigned c:32;      
}S2;   
typedef struct node3 
{   
 unsigned int a:4;   
 unsigned int :0;   
 int :6; //这个位段放在一个新的位段存储单元    
 unsigned c:32;//由于6+32>32,所位段c也放在一个新的位段存储单元,所以占4+4+4=12Byte  
}S3;   
typedef struct node4  
{   
unsigned int a:1;   
char b;  //在一个位段存储单元中能够存下所有的成员,所以占4Byte    
int c:1;   int d:2;   unsigned int e:2; 
}S4;     
nt main(int argc, char *argv[]) 
{   
S4 s4;   
s4.a=1;   
s4.c=1;   
s4.d=2;          
s4.e=3;   
printf("%d %d %d %d\n",s4.a,s4.c,s4.d,s4.e);   
printf("%d %d %d %d %d\n",sizeof(S),sizeof(S1),sizeof(S2),sizeof(S3),sizeof(S4));   
return 0; 
}
登入後複製
執行結果為:

1 -1 -2 3

4 1 8 12 4
請按任意鍵繼續. . .

當列印s4的各個位段時,列印的結果與賦的初始值不同。 🎜🎜由於c只佔1位,那麼沒有數據位,此時進行符號擴展直接在高位添加1,所以打印的結果為-1;🎜🎜由於d佔2位,那麼當將2賦給d時,內存中儲存的內容為10,此時進行符號擴展,高位補1,則為0XFF FF FF FE,那麼其真值則為-2.🎜🎜感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持! 🎜🎜🎜🎜
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

char在C語言字符串中的作用是什麼 char在C語言字符串中的作用是什麼 Apr 03, 2025 pm 03:15 PM

在 C 語言中,char 類型在字符串中用於:1. 存儲單個字符;2. 使用數組表示字符串並以 null 終止符結束;3. 通過字符串操作函數進行操作;4. 從鍵盤讀取或輸出字符串。

C語言各種符號的使用方法 C語言各種符號的使用方法 Apr 03, 2025 pm 04:48 PM

C 語言中符號的使用方法涵蓋算術、賦值、條件、邏輯、位運算符等。算術運算符用於基本數學運算,賦值運算符用於賦值和加減乘除賦值,條件運算符用於根據條件執行不同操作,邏輯運算符用於邏輯操作,位運算符用於位級操作,特殊常量用於表示空指針、文件結束標記和非數字值。

char在C語言中如何處理特殊字符 char在C語言中如何處理特殊字符 Apr 03, 2025 pm 03:18 PM

C語言中通過轉義序列處理特殊字符,如:\n表示換行符。 \t表示製表符。使用轉義序列或字符常量表示特殊字符,如char c = '\n'。注意,反斜杠需要轉義兩次。不同平台和編譯器可能有不同的轉義序列,請查閱文檔。

c#多線程和異步的區別 c#多線程和異步的區別 Apr 03, 2025 pm 02:57 PM

多線程和異步的區別在於,多線程同時執行多個線程,而異步在不阻塞當前線程的情況下執行操作。多線程用於計算密集型任務,而異步用於用戶交互操作。多線程的優勢是提高計算性能,異步的優勢是不阻塞 UI 線程。選擇多線程還是異步取決於任務性質:計算密集型任務使用多線程,與外部資源交互且需要保持 UI 響應的任務使用異步。

char與wchar_t在C語言中的區別 char與wchar_t在C語言中的區別 Apr 03, 2025 pm 03:09 PM

在 C 語言中,char 和 wchar_t 的主要區別在於字符編碼:char 使用 ASCII 或擴展 ASCII,wchar_t 使用 Unicode;char 佔用 1-2 個字節,wchar_t 佔用 2-4 個字節;char 適用於英語文本,wchar_t 適用於多語言文本;char 廣泛支持,wchar_t 依賴於編譯器和操作系統是否支持 Unicode;char 的字符範圍受限,wchar_t 的字符範圍更大,並使用專門的函數進行算術運算。

char在C語言中如何進行類型轉換 char在C語言中如何進行類型轉換 Apr 03, 2025 pm 03:21 PM

在 C 語言中,char 類型轉換可以通過:強制類型轉換:使用強制類型轉換符將一種類型的數據直接轉換為另一種類型。自動類型轉換:當一種類型的數據可以容納另一種類型的值時,編譯器自動進行轉換。

char和unsigned char的區別是什麼 char和unsigned char的區別是什麼 Apr 03, 2025 pm 03:36 PM

char 和 unsigned char 是存儲字符數據的兩種數據類型,主要區別在於處理負數和正數的方式:值範圍:char 有符號 (-128 到 127),unsigned char 無符號 (0 到 255)。負數處理:char 可以存儲負數,unsigned char 不能。位模式:char 最高位表示符號,unsigned char 無符號位。算術運算:char 和 unsigned char 作為有符號和無符號類型,其算術運算方式不同。兼容性:char 和 unsigned char

char數組在C語言中如何使用 char數組在C語言中如何使用 Apr 03, 2025 pm 03:24 PM

char 數組在 C 語言中存儲字符序列,聲明為 char array_name[size]。訪問元素通過下標運算符,元素以空終止符 '\0' 結尾,用於表示字符串終點。 C 語言提供多種字符串操作函數,如 strlen()、strcpy()、strcat() 和 strcmp()。

See all articles