结构体之位域全面分析
結構體的定義
?
typedef struct TEST {... }Test,*pTest;struct TEST {... }test
這里的test是一個TEST變量。。
?
結構體之位域
有些信息在存儲時,并不需要占用一個完整的字節, 而只需占幾個或一個二進制位。例如在存放一個開關量時,只有0和1 兩種狀態, 用一位二進位即可。為了節省存儲空間,并使處理簡便,C語言又提供了一種數據結構,稱為“位域”或“位段”。所謂“位域”是把一個字節中的二進位劃分為幾 個不同的區域, 并說明每個區域的位數。每個域有一個域名,允許在程序中按域名進行操作。 這樣就可以把幾個不同的對象用一個字節的二進制位域來表示。
例如:
struct TEST{int a:5;int b:7;int c:3; };位域的大小:
一個位域必須存儲在同一個字節中,不能跨兩個成員變量類型。如一個成員變量所剩空間不夠存放另一位域時,應從下一成員變量起存放該位域。也可以有意使某位域?從下一成員變量開始。
拿上面的例子來說吧, sizeof(TEST)=4
struct test3{int a:29;int b:29;int c:4; };sizeof(test3)=12;
?
struct test4{int a:27;int b:27;int c:4; } ;
sizeof(test4)=8。
位存放的值:
#include<iostream>
using namespace std;struct TEST{int a:5;int b:7;int c:3;
};void main()
{TEST mytest;memcpy(&mytest,"HelloWorld",sizeof(mytest));cout<<mytest.a<<endl; cout<<mytest.b<<endl;cout<<mytest.c<<endl;
}
?
結果分析:內存拷貝函數只拷貝了4個字符到mytest中,mytest中的三個變量加起來才15位,其它17位我們不要管。那么這15位中的值是怎么樣的呢?15位還沒到2個字節,所以這15位中全在He中,H的AscII碼為72(01001000),e的AscII 碼為112(01100101),根據小端法,我們知道他們的存儲方式為:01100101 01001000,a占前5位:01000即8;
b占接下來的7位,0101010即42;c占接下來的3位,110即-2(因為這里是有符號數,高位為1,表示負數,所以是-2)。如果把他們全變成unsigned int,如:
struct TEST{unsigned int a:5;unsigned int b:7;unsigned int c:3; };?
那么輸出就是:8,42,6。
?
總結
以上是生活随笔為你收集整理的结构体之位域全面分析的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 灰色系统与灰色预测模型
- 下一篇: 恒安标准人寿:念好小公司数据保护生意经