日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

结构体之位域全面分析

發(fā)布時間:2024/4/13 编程问答 47 豆豆
生活随笔 收集整理的這篇文章主要介紹了 结构体之位域全面分析 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

結(jié)構(gòu)體的定義

?

typedef struct TEST {... }Test,*pTest;struct TEST {... }test


這里的test是一個TEST變量。。

?

結(jié)構(gòu)體之位域

有些信息在存儲時,并不需要占用一個完整的字節(jié), 而只需占幾個或一個二進制位。例如在存放一個開關(guān)量時,只有0和1 兩種狀態(tài), 用一位二進位即可。為了節(jié)省存儲空間,并使處理簡便,C語言又提供了一種數(shù)據(jù)結(jié)構(gòu),稱為“位域”或“位段”。所謂“位域”是把一個字節(jié)中的二進位劃分為幾 個不同的區(qū)域, 并說明每個區(qū)域的位數(shù)。每個域有一個域名,允許在程序中按域名進行操作。 這樣就可以把幾個不同的對象用一個字節(jié)的二進制位域來表示。

例如:

struct TEST{int a:5;int b:7;int c:3; };

位域的大小:

一個位域必須存儲在同一個字節(jié)中,不能跨兩個成員變量類型。如一個成員變量所剩空間不夠存放另一位域時,應從下一成員變量起存放該位域。也可以有意使某位域?從下一成員變量開始。

拿上面的例子來說吧, 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; }


?

結(jié)果分析:內(nèi)存拷貝函數(shù)只拷貝了4個字符到mytest中,mytest中的三個變量加起來才15位,其它17位我們不要管。那么這15位中的值是怎么樣的呢?15位還沒到2個字節(jié),所以這15位中全在He中,H的AscII碼為72(01001000),e的AscII 碼為112(01100101),根據(jù)小端法,我們知道他們的存儲方式為:01100101 01001000,a占前5位:01000即8;

b占接下來的7位,0101010即42;c占接下來的3位,110即-2(因為這里是有符號數(shù),高位為1,表示負數(shù),所以是-2)。如果把他們?nèi)兂蓇nsigned int,如:

struct TEST{unsigned int a:5;unsigned int b:7;unsigned int c:3; };

?

那么輸出就是:8,42,6。

?

總結(jié)

以上是生活随笔為你收集整理的结构体之位域全面分析的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。