青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

franksunny的個(gè)人技術(shù)空間
獲得人生中的成功需要的專注與堅(jiān)持不懈多過天才與機(jī)會(huì)。 ——C.W. Wendte

C/C++ 結(jié)構(gòu)體的一個(gè)高級(jí)特性 ―― 指定成員的位數(shù)

?

在大多數(shù)情況下,我們一般這樣定義結(jié)構(gòu)體:

struct student

{

????????????? ? unsigned int sex;

????????????? unsigned int age;

};

對(duì)于一般的應(yīng)用,這已經(jīng)能很充分地實(shí)現(xiàn)數(shù)據(jù)了的 封裝

但是,在實(shí)際工程中,往往碰到這樣的情況:那就是要用一個(gè)基本類型變量中的不同的位表示不同的含義。譬如一個(gè) cpu 內(nèi)部的標(biāo)志寄存器,假設(shè)為 16 bit ,而每個(gè) bit 都可以表達(dá)不同的含義,有的表示結(jié)果是否為 0 ,有的表示是否越界等等。這個(gè)時(shí)候我們用什么數(shù)據(jù)結(jié)構(gòu)來表達(dá)這個(gè)寄存器呢?

答案還是結(jié)構(gòu)體!

為達(dá)到此目的,我們要用到結(jié)構(gòu)體的高級(jí)特性,那就是在基本成員變量的后面添加“ : 數(shù)據(jù)位數(shù)”組成新的結(jié)構(gòu)體:

struct xxx

{

????????????? 成員 1 類型成員 1 : 成員 1 位數(shù) ;

?????? ????? ? 成員 2 類型成員 2 : 成員 2 位數(shù) ;

?????? ????? ? 成員 3 類型成員 3 : 成員 3 位數(shù) ;

};

基本的成員變量就會(huì)被拆分!這個(gè)語法在初級(jí)編程中很少用到,但是在高級(jí)程序設(shè)計(jì)中不斷地被用到!例如:

struct student

{

????????????? ? unsigned int sex : 1;

????????????? unsigned int age : 15;

};

上述結(jié)構(gòu)體中的兩個(gè)成員 sex age 加起來只占用了一個(gè) unsigned int 的空間(假設(shè) unsigned int 16 位)。

基本成員變量被拆分后,訪問的方法仍然和訪問沒有拆分的情況是一樣的,例如:

struct student sweek;

sweek.sex = MALE;// 這里的 MALE 只能是 0 1 ,值不能大于 1

sweek.age = 20;

雖然拆分基本成員變量在語法上是得到支持的,但是并不等于我們想怎么分就怎么分,例如下面的拆分顯然是不合理的:

struct student

{

????????????? ??? unsigned int sex : 1;

????????????? ? unsigned int age : 12;

};

這是因?yàn)?/span> 1+12 = 13 ,不能再組合成一個(gè)基本成員,不能組合成 char int 或任何類型,這顯然是不能 自圓其說 的。

在拆分基本成員變量的情況下,我們要特別注意數(shù)據(jù)的存放順序,這還與 CPU Big endian 還是 Little endian 來決定。 Little endian Big endian CPU 存放數(shù)據(jù)的兩種不同順序。對(duì)于整型、長(zhǎng)整型等數(shù)據(jù)類型, Big endian 認(rèn)為第一個(gè)字節(jié)是最高位字節(jié)(按照從低地址到高地址的順序存放數(shù)據(jù)的高位字節(jié)到低位字節(jié));而 Little endian 則相反,它認(rèn)為第一個(gè)字節(jié)是最低位字節(jié)(按照從低地址到高地址的順序存放數(shù)據(jù)的低位字節(jié)到高位字節(jié))。

我們定義 IP 包頭結(jié)構(gòu)體為:

struct iphdr {

#if defined(__LITTLE_ENDIAN_BITFIELD)

?????? __u8?????? ihl:4,

?????? ?????? version:4;

#elif defined (__BIG_ENDIAN_BITFIELD)

?????? __u8?????? version:4,

???? ?????? ihl:4;

#else

#error?????? "Please fix <asm/byteorder.h>"

#endif

?????? __u8?????? tos;

?????? __u16?????? tot_len;

?????? __u16?????? id;

?????? __u16?????? frag_off;

?????? __u8?????? ttl;

?????? __u8?????? protocol;

?????? __u16?????? check;

?????? __u32?????? saddr;

?????? __u32?????? daddr;

?????? /*The options start here. */

};

Little endian 模式下, iphdr 中定義:

?????? __u8?????? ihl:4,

?????? ?????? version:4;

其存放方式為:

1 字節(jié)低 4 ?ihl

1 字節(jié)高 4 ?version IP 的版本號(hào))

若在 Big endian 模式下還這樣定義,則存放方式為:

1 字節(jié)低 4 ?version IP 的版本號(hào))

1 字節(jié)高 4 ?ihl

這與實(shí)際的 IP 協(xié)議是不匹配的,所以在 Linux 內(nèi)核源代碼中, IP 包頭結(jié)構(gòu)體的定義利用了宏:

#if defined(__LITTLE_ENDIAN_BITFIELD)

#elif defined (__BIG_ENDIAN_BITFIELD)

#endif

來區(qū)分兩種不同的情況。

由此我們總結(jié)全文的主要觀點(diǎn):

1 ?????? C/C++ 語言的結(jié)構(gòu)體支持對(duì)其中的基本成員變量按位拆分;

2 ?????? 拆分的位數(shù)應(yīng)該是合乎邏輯的,應(yīng)仍然可以組合為基本成員變量;

要特別注意拆分后的數(shù)據(jù)的存放順序,這一點(diǎn)要結(jié)合具體的 CPU 的結(jié)構(gòu)。

?

?

?

?

該文是由宋寶華處轉(zhuǎn)載而來的,筆者以前從未知道結(jié)構(gòu)體還可以這樣用法,筆者做過嘗試,再 VC 下用過的感受有兩點(diǎn)

1、????????????? 結(jié)構(gòu)體按位拆分時(shí),雖然宋兄提醒不能拆分如文中紅色背景顯示的情況,但是本人試過,并非是不可以的,而且如果 CPU 支持 32 的話,顯然文中的以 16 位來分配的話也是沒有達(dá)到要求的。

2、????????????? 按位拆分時(shí)字節(jié)數(shù)目問題,我們先看兩例

?????? struct student1

?????? {

????????????? unsigned char sex : 1;

????????????? unsigned int? no : 5;

????????????? char??????? ??age : 7;

????????????? int????????? grade : 10;

?????? };

?

????????????? struct student2

?????? {

????????????? unsigned char sex : 1;

????????????? char??????? ? ?age : 7;

????????????? unsigned int ?no : 5;???????????

????????????? int????????? grade : 10;

?????? };

以上兩例中雖然意思并不大,但是如果按 int 2 字節(jié) 16 char 1 字節(jié) 8 位來劃分內(nèi)存的話,那么 student1 占用了 6 字節(jié)共 48 位,但是實(shí)際使用了 23 位,另外 25 位沒定義,而 student2 占用了 3 字節(jié)共 24 位,但是實(shí)際使用也是 23 位。這個(gè)過程,我把它總結(jié)為前后變量的類型不一致時(shí),字節(jié)就重新分配。

3、????????????? 賦值過程中數(shù)據(jù)編碼問題。還看兩例

?????? student1 ss;

?????? ss.age = 255;

?????? student2 st;

?????? st.age= 191;

ss.age 的值為 -1 ,而 st.age 的值為 63 ,其實(shí) 255 11111111 ,因?yàn)槭?/span> 7 位,所以采用截?cái)喾绞剑兂?/span> 1111111 ,又因?yàn)?/span> age 是有符號(hào)的變量,所以根據(jù)負(fù)數(shù)的編碼規(guī)則賦值 255 時(shí)得到的結(jié)果就是 -1 。在這里采用了截?cái)嗟姆绞剑瑸橹拐_賦值時(shí)一定不能大于位數(shù)編碼值。

以上是個(gè)人學(xué)習(xí)宋兄文章的小小實(shí)踐小結(jié),歡迎大家給出更理論的總結(jié)。原文請(qǐng)查看 http://blog.donews.com/21cnbao/archive/2006/10/07/1054807.aspx

posted on 2006-10-20 00:05 frank.sunny 閱讀(6686) 評(píng)論(7)  編輯 收藏 引用 所屬分類: C/C++學(xué)習(xí)和實(shí)踐

FeedBack:
# re: C/C++結(jié)構(gòu)體的一個(gè)高級(jí)特性――指定成員的位數(shù)
2006-10-20 13:31 | guest
位域,已經(jīng)是一個(gè)很古老的特性了  回復(fù)  更多評(píng)論
  
# re: C/C++結(jié)構(gòu)體的一個(gè)高級(jí)特性――指定成員的位數(shù)
2006-10-20 20:34 | 木葉流水
student2 占用了 3 字節(jié)?
unsigned char sex : 1;
char age : 7; 分別占一個(gè)字節(jié) unsigned int no : 5;
int grade : 10;兩個(gè)加起來占一個(gè)字節(jié)是吧
一共三個(gè)字節(jié)  回復(fù)  更多評(píng)論
  
# re: C/C++結(jié)構(gòu)體的一個(gè)高級(jí)特性――指定成員的位數(shù)
2006-10-20 21:04 | frank.sunny
非常感謝樓上不留名的大俠指點(diǎn),我還算是個(gè)新手,謝謝你一語道破了,這只是一個(gè)“位域”概念,本人搜索了一下這一概念,發(fā)現(xiàn)有一個(gè)人總結(jié)的還比較可以的
總結(jié)如下:
使用位域的主要目的是壓縮存儲(chǔ),其大致規(guī)則為:
1) 如果相鄰位域字段的類型相同,且其位寬之和小于類型的sizeof大小,則后面的字段將緊鄰前一個(gè)字段存儲(chǔ),直到不能容納為止;
2) 如果相鄰位域字段的類型相同,但其位寬之和大于類型的sizeof大小,則后面的字段將從新的存儲(chǔ)單元開始,其偏移量為其類型大小的整數(shù)倍;
3) 如果相鄰的位域字段的類型不同,則各編譯器的具體實(shí)現(xiàn)有差異,VC6采取不壓縮方式,Dev-C++采取壓縮方式;
4) 如果位域字段之間穿插著非位域字段,則不進(jìn)行壓縮;
5) 整個(gè)結(jié)構(gòu)體的總大小為最寬基本類型成員大小的整數(shù)倍。


樓上木葉流水兄,看過這個(gè)總結(jié)不知道是否有更清晰的了解啊,可以看他網(wǎng)頁(yè)
http://blog.csdn.net/jiyucn/archive/2006/07/01/862085.aspx

  回復(fù)  更多評(píng)論
  
# re: C/C++結(jié)構(gòu)體的一個(gè)高級(jí)特性――指定成員的位數(shù)
2006-10-25 20:17 | 清風(fēng)雨
這個(gè)特性,在現(xiàn)在內(nèi)存相對(duì)充足來說,基本是無所謂的;除非你做嵌入式開發(fā)或許有點(diǎn)用(不是做這個(gè)的,不了解)。
另外,他會(huì)成員的訪問低效;而且加上內(nèi)存對(duì)齊,這里節(jié)省的空間又被編譯器為了性能填充的無用字節(jié)給浪費(fèi)了(當(dāng)然,你可以設(shè)置不對(duì)齊)。
在現(xiàn)在,這個(gè)特性,真的是很古老哦(而且基本無用),也算不上高級(jí)啦!
當(dāng)然,你作為了解了解一下也是好的。
  回復(fù)  更多評(píng)論
  
# re: C/C++結(jié)構(gòu)體的一個(gè)高級(jí)特性――指定成員的位數(shù)
2006-10-26 09:39 | frank.sunny
@清風(fēng)雨
其實(shí)題目是沿用原作者的,我也是學(xué)習(xí)用的,他本人就是搞嵌入式的,我覺得這個(gè)可以搞懂些變量底層的東西

謝謝大俠關(guān)心啊,呵呵  回復(fù)  更多評(píng)論
  
# re: C/C++結(jié)構(gòu)體的一個(gè)高級(jí)特性――指定成員的位數(shù)
2008-07-01 11:41 | Eagles
學(xué)習(xí)了!!!!  回復(fù)  更多評(píng)論
  
# re: C/C++結(jié)構(gòu)體的一個(gè)高級(jí)特性――指定成員的位數(shù)
2009-05-27 15:57 | Alec C.
位域在嵌入式開發(fā)中還是很有用的,特別是涉及到底層協(xié)議的時(shí)候  回復(fù)  更多評(píng)論
  

常用鏈接

留言簿(13)

隨筆分類

個(gè)人其它博客

基礎(chǔ)知識(shí)鏈接

最新評(píng)論

閱讀排行榜

評(píng)論排行榜

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            在线视频亚洲一区| 在线视频日韩精品| 欧美日韩日韩| 欧美日韩在线观看一区二区三区| 欧美精品啪啪| 欧美视频在线观看免费网址| 国产精品每日更新| 国产亚洲欧美一区| 亚洲国产欧美在线人成| 亚洲视频中文字幕| 久久久国产午夜精品| 久久婷婷丁香| 91久久精品一区| 亚洲美女黄网| 午夜精品三级视频福利| 欧美v亚洲v综合ⅴ国产v| 欧美新色视频| 很黄很黄激情成人| 99视频在线精品国自产拍免费观看| 亚洲香蕉在线观看| 嫩草影视亚洲| 亚洲一区二区3| 噜噜噜噜噜久久久久久91| 国产精品爱啪在线线免费观看| 国产午夜精品一区二区三区视频| 91久久综合| 久久国产88| 一本久久a久久精品亚洲| 久久久久国产精品人| 欧美三级小说| 在线观看一区二区视频| 亚洲午夜精品17c| 欧美va天堂va视频va在线| 一区二区三区福利| 欧美成人按摩| 狠狠噜噜久久| 亚洲欧美激情一区| 亚洲麻豆av| 欧美黑人国产人伦爽爽爽| 韩国视频理论视频久久| 一区二区三区精品国产| 国产热re99久久6国产精品| 亚洲激情第一区| 欧美综合国产| 一本色道久久88亚洲综合88| 欧美成人精品| 亚洲国产日韩欧美在线99| 久久精品国产第一区二区三区| 日韩视频一区二区在线观看 | 亚洲福利av| 久久久久久97三级| 亚洲欧美区自拍先锋| 国产精品白丝jk黑袜喷水| 99v久久综合狠狠综合久久| 欧美mv日韩mv国产网站| 久久久亚洲高清| 尤物九九久久国产精品的分类| 欧美专区日韩专区| 亚洲一区二区三区四区在线观看| 欧美性猛交99久久久久99按摩 | 久久久久久久网| 国内自拍一区| 久久夜色精品国产| 久久久久99| 在线成人av.com| 欧美二区在线播放| 免费欧美日韩| 99综合电影在线视频| 亚洲精品一区二| 国产精品第十页| 久久成人羞羞网站| 久久精品卡一| 91久久久久久久久久久久久| 亚洲大胆av| 欧美日韩高清免费| 午夜久久黄色| 久久理论片午夜琪琪电影网| 91久久精品美女| 99在线观看免费视频精品观看| 国产精品理论片| 久久人人爽人人爽| 欧美激情一区二区三区在线| 亚洲天天影视| 久久久www成人免费精品| 亚洲精品日韩精品| 国产精品99久久久久久人 | 亚洲一区二区在线播放| 亚洲图片欧美一区| 国精品一区二区| 亚洲国产精品精华液2区45 | 国产精品视频第一区| 亚洲精品韩国| 宅男在线国产精品| 国产日产亚洲精品| 欧美成ee人免费视频| 欧美精品日韩三级| 久久久久久69| 欧美日韩不卡视频| 久久久久久亚洲精品杨幂换脸 | 一区二区三区视频免费在线观看| 国产日韩亚洲欧美精品| 亚洲高清不卡一区| 国产麻豆精品久久一二三| 亚洲成人在线网| 国产精品一区免费视频| 亚洲黄色在线| 狠狠色丁香婷婷综合久久片| 亚洲日本欧美日韩高观看| 国产一区二区三区精品欧美日韩一区二区三区| 久久久久久久久久久一区| 国产精品久久久久9999吃药| 亚洲国产成人午夜在线一区| 一区二区三区在线看| 亚洲视频一二| 一本色道久久综合亚洲精品婷婷 | 99国产精品久久| 久久精品一区二区| 篠田优中文在线播放第一区| 欧美精品久久99| 亚洲国产电影| 亚洲第一中文字幕在线观看| 欧美一级黄色网| 午夜精品国产更新| 欧美小视频在线| 99亚洲一区二区| 中文在线不卡视频| 欧美精品三区| 亚洲日本在线视频观看| 亚洲人久久久| 免费成人激情视频| 亚洲福利在线视频| 亚洲久久在线| 欧美激情一区二区三区成人| 亚洲国产精品久久久久| 亚洲精品美女| 欧美国产激情二区三区| 亚洲国产一区二区在线| 亚洲精选视频免费看| 欧美金8天国| 亚洲精美视频| 中国成人亚色综合网站| 欧美三级日韩三级国产三级| 在线综合亚洲| 欧美一站二站| 国内精品久久久| 久久久女女女女999久久| 蜜桃av一区二区在线观看| 亚洲黄色av一区| 欧美激情第一页xxx| 亚洲欧洲综合另类在线| 亚洲小说欧美另类社区| 日韩天堂在线视频| 香蕉久久夜色精品| 久久久久一区| **欧美日韩vr在线| 美女成人午夜| 亚洲精品中文字| 欧美综合国产| 亚洲欧洲综合| 国产精品日韩| 久久久xxx| 亚洲精品一区二区三区av| 欧美在线二区| 亚洲第一狼人社区| 欧美视频一区在线观看| 久久gogo国模裸体人体| 欧美激情2020午夜免费观看| 亚洲桃色在线一区| 国产手机视频一区二区| 麻豆精品一区二区av白丝在线| 最新国产乱人伦偷精品免费网站| 欧美亚洲视频一区二区| 亚洲大黄网站| 国产精品美女久久久久久免费| 久久精品免费| 一本色道久久精品| 欧美成人一二三| 亚洲综合国产| 亚洲国产综合在线看不卡| 国产精品久久久久久久一区探花| 久久精品一区二区三区不卡牛牛| 亚洲美女视频网| 蜜臀99久久精品久久久久久软件| 亚洲一区www| 亚洲国产高清在线| 国内激情久久| 国产精品裸体一区二区三区| 美女91精品| 久久国内精品视频| 亚洲图片在线| 亚洲精品免费在线| 欧美大胆a视频| 久久久精品久久久久| 亚洲综合久久久久| 一区二区国产精品| 亚洲精品乱码久久久久久日本蜜臀| 韩日精品视频一区| 国产精品一区二区在线| 欧美亚洲不卡| 欧美色图一区二区三区|