詳解C語言位域的使用與注意事項
位域的定義
有些信息在存儲時,并不需要占用一個完整的字節(jié), 而只需占幾個或一個二進制位。例如在存放一個開關(guān)量時,只有0和1 兩種狀態(tài), 用一位二進位即可。為了節(jié)省存儲空間,并使處理簡便,C語言又提供了一種數(shù)據(jù)結(jié)構(gòu),稱為“位域”或“位段”。所謂“位域”是把一個字節(jié)中的二進位劃分為幾個不同的區(qū)域,并說明每個區(qū)域的位數(shù)。每個域有一個域名,允許在程序中按域名進行操作。 這樣就可以把幾 個不同的對象用一個字節(jié)的二進制位域來表示。
位域的定義和位域變量的說明位域定義與結(jié)構(gòu)定義相仿,其形式為:
struct 位域結(jié)構(gòu)名 { 位域列表 }; eg:struct weiyu { int a:2; int b:5; int :5;//此五位為空域,不能使用 int c:3; }
位域雖然簡單好用,但使用時需要注意:
1) 如果相鄰位域字段的類型相同,且其位寬之和小于類型的sizeof大小,則后面的字段將緊鄰前一個字段存儲,直到不能容納為止;
2) 如果相鄰位域字段的類型相同,但其位寬之和大于類型的sizeof大小,則后面的字段將從新的存儲單元開始,其偏移量為其類型大小的整數(shù)倍;
3) 整個結(jié)構(gòu)體的總大小為最寬基本類型成員大小的整數(shù)倍。
4) 如果相鄰的位域字段的類型不同,則各編譯器的具體實現(xiàn)有差異,VC6采取不壓縮方式,Dev-C++采取壓縮方式;
5) 如果位域字段之間穿插著非位域字段,則不進行壓縮;(不針對所有的編譯器)
注意:4 ,5跟編譯器有較大的關(guān)系,使用時要慎重,盡量避免。
#include "stdio.h" void main(int argn ,char *argv) { struct test { unsigned a:10; unsigned b:10; unsigned c:6; unsigned :2;//this two bytes can't use unsigned d:4; }data,*pData; data.a=0x177; data.b=0x111; data.c=0x7; data.d=0x8; pData=&data; printf("data.a=%x data.b= %x data.c=%x data.d=%xn",pData->a,pData->b,pData->c,pData->d);//位域可以使用指針 printf("sizeof(data)=%dn",sizeof(data)); //4 bytes ,最常用的情況 struct testLen{ char a:5; char b:5; char c:5; char d:5; char e:5; }len; printf("sizeof(len)=%dn",sizeof(len)); //5bytes 規(guī)則2 struct testLen1{ char a:5; char b:2; char d:3; char c:2; char e:7; }len1; printf("sizeof(len1) =%dn",sizeof(len1)); //3bytes 規(guī)則1 struct testLen2{ char a:2; char :3; char b:7; long d:20; //4bytes char e:4; }len2; printf("sizeof(len2)=%dn",sizeof(len2)); //12 規(guī)則3,4,5,總長為4的整數(shù)倍,2+3 占1byte,b占1bye 由于與long對其,2+3+7 占4字節(jié),后面 d 與 e進行了優(yōu)化 占一個4字節(jié) struct testLen3{ char a:2; char :3; char b:7; long d:30; char e:4; }len3; printf("sizeof(len3)=%dn",sizeof(len3));//12 規(guī)則3,4,5,總長為4的整數(shù)倍,2+3 占1byte,b占1bye 由于與long對其,2+3+7 占4字節(jié),后面 d占一個4字節(jié),為了保證與long對其e獨占一個4字節(jié) }
總結(jié)
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家學(xué)習(xí)或者使用C語言能帶來一定的幫助,如果有疑問大家可以留言交流。
- C語言編程中建立和解除內(nèi)存映射的方法
- 使用C語言判斷棧的方向?qū)嵗?/a>
- C語言輾轉(zhuǎn)相除法求2個數(shù)的最小公約數(shù)
- C語言從txt文件中逐行讀入數(shù)據(jù)存到數(shù)組中的實現(xiàn)方法
- c語言實現(xiàn)把文件中數(shù)據(jù)讀取并存到數(shù)組中
- 利用C語言的Cairo圖形庫繪制太極圖實例教程
- C語言設(shè)計一個閃閃的圣誕樹
- 使用C語言編寫圣誕表白程序
- C語言實現(xiàn)返回字符串函數(shù)的四種方法
- C語言 棧的表示和實現(xiàn)詳細(xì)介紹
- C語言 經(jīng)典題目螺旋矩陣 實例詳解
- C語言 文件操作解析詳解及實例代碼
- C語言實現(xiàn)大數(shù)據(jù)文件的內(nèi)存映射機制
相關(guān)文章
JS調(diào)用C++函數(shù)拋出異常及捕捉異常詳解
這篇文章主要介紹了js調(diào)用C++函數(shù)的方法示例,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2021-08-08C++中動態(tài)綁定和內(nèi)存管理的實現(xiàn)
本文主要介紹了C++中動態(tài)綁定和內(nèi)存管理的實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2024-12-12C++實現(xiàn)LeetCode(141.單鏈表中的環(huán))
這篇文章主要介紹了C++實現(xiàn)LeetCode(141.單鏈表中的環(huán)),本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-07-07C語言 makefile學(xué)習(xí)及實現(xiàn)實例
這篇文章主要介紹了C語言 makefile學(xué)習(xí)及實現(xiàn)實例的相關(guān)資料,需要的朋友可以參考下2017-03-03C++實現(xiàn)旋轉(zhuǎn)數(shù)組的二分查找
這篇文章主要介紹了C++實現(xiàn)旋轉(zhuǎn)數(shù)組的二分查找方法,涉及數(shù)組的操作,有值得借鑒的技巧,需要的朋友可以參考下2014-09-09