国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

【詳解】C語言冷門知識點之--位段

這篇具有很好參考價值的文章主要介紹了【詳解】C語言冷門知識點之--位段。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

一, 位段的解釋

下面是維基百科對位段的解釋:

??位段(或稱“位域”,Bit field)為一種數(shù)據(jù)結(jié)構(gòu),可以把數(shù)據(jù)以位的形式緊湊的儲存,并允許程序員對此結(jié)構(gòu)的位進行操作。這種數(shù)據(jù)結(jié)構(gòu)的好處:

  • 可以使數(shù)據(jù)單元節(jié)省儲存空間,當程序需要成千上萬個數(shù)據(jù)單元時,這種方法就顯得尤為重要。
  • 位段可以很方便的訪問一個整數(shù)值的部分內(nèi)容從而可以簡化程序源代碼。

??而位域這種數(shù)據(jù)結(jié)構(gòu)的缺點在于,其內(nèi)存分配與內(nèi)存對齊的實現(xiàn)方式依賴于具體的機器和系統(tǒng),在不同的平臺可能有不同的結(jié)果,這導致了位段在本質(zhì)上是不可移植的

二, 位段的聲明和使用

  • 雖然位段可以決定用多少位來儲存數(shù)據(jù),但是切不可認為位段就是可以自定義一個數(shù)據(jù)類型。位段是依賴結(jié)構(gòu)體來實現(xiàn)的,我們可以認為位段是可以將一個盒子里面格子自定義大小。
    【詳解】C語言冷門知識點之--位段,C語言學習,c語言,開發(fā)語言,學習方法,c++

位段的聲明:

struct A
{
	int _a : 2;
	int _b : 5;
	int _c : 10;
	int _d : 30;
};

需要注意的是:

  • 這里面的數(shù)字代表的不是字節(jié),是比特(bit)。
  • 位段成員的類型只能是整型家族的,例如:int, unsigned int, signed int, char。

位段的使用:

int main()
{
	struct A a;
	a._a = 2;
	a._b = 3;
	a._c = 5;
	a._d = 10;
	return 0;
}

相當于實例化后的a里面的不同大小的內(nèi)存里放入了數(shù)據(jù)。

三,位段的空間大小計算

因為不同平臺上的規(guī)則都是不太一樣的,計算出來的結(jié)果也會有些許差異,以下使用vs2022的x64環(huán)境下運行的
例如:

第一個例子:

#include <stdio.h>
struct A
{
	int _a : 2;//二進制位
	int _b : 5;
	int _c : 10;
	int _d : 30;
};

int main()
{
	printf("%d", sizeof(struct A));
	return 0;
}

上面代碼的輸出結(jié)果是8。

  • 聲明類型是int類型的,所以一開始先開辟4個字節(jié)的內(nèi)存,也就是32bit。
  • _a用掉了2bit,還剩下30bit。
  • _b用掉了5bit,還剩下25bit。
  • _c用掉了10bit,還剩下15bit。
  • _d需要30bit的空間,但是預(yù)先開辟的空間只剩下15bit,所以我們還需要再開辟一個int大小的空間,之前剩下的15bit的空間選擇不使用,_d的30bit全放在第二個空間內(nèi)。
  • 結(jié)果為8

第二個例子:

#include <stdio.h>
struct B
{
	int _a : 30;//二進制位
	int _b : 4;
	int _d : 32;
};

int main()
{
	printf("%d", sizeof(struct B));
	return 0;
}
  • 聲明類型是int類型的,所以一開始先開辟4個字節(jié)的內(nèi)存,也就是32bit。
  • _a用掉了30bit,還剩下2bit。
  • 由于只剩下2bit,_b需要4bit,所以舍棄2bit,再開辟一個32bit空間, _b用掉了4bit,還剩下28bit。
  • 由于只剩下28bit,_d需要32bit,所以舍棄28bit,再開辟一個32bit空間,_d用掉了32bit
  • 總共開辟了3次int類型的空間,所以結(jié)果為12

注意:

??大家有沒有發(fā)現(xiàn),我們在聲明位段的時候,如果定義的是int,那么冒號后面跟上的數(shù)字不能超過32,如果定義的是char,那么冒號后面跟上的數(shù)字不能超過8。如果超過以后,就會報出以下錯誤:
【詳解】C語言冷門知識點之--位段,C語言學習,c語言,開發(fā)語言,學習方法,c++

??其實根據(jù)內(nèi)存對齊原則,如果超出以后,處理器就需要訪問兩次才能完整的得到數(shù)據(jù)。所以在定義的時候,應(yīng)該避免超出應(yīng)有的內(nèi)存大小。

四, 位段的內(nèi)存分配

  • 位段分配的內(nèi)存中的比特位是從左向右使用的,還是從右向左使用的呢?
  • 如何證明內(nèi)存分配剩余的比特位不夠使用時,是繼續(xù)使用還是浪費掉呢?

接下來我們分析:
用例代碼:

#include <stdio.h>
struct A
{
	char _a : 3;
	char _b : 4;
	char _c : 5;
	char _d : 4;
};
int main()
{
	struct A a = {0};
	a._a = 10;
	a._b = 12;
	a._c = 3;
	a._d = 4;
	return 0;
}

我們假設(shè):位段分配的內(nèi)存中的比特位是從右向左使用的,分配剩余的比特位不夠使用時,浪費掉剩余內(nèi)存。
則:

  • 我們先定義位段,如下圖:
    【詳解】C語言冷門知識點之--位段,C語言學習,c語言,開發(fā)語言,學習方法,c++
  • 執(zhí)行程序:a._a = 10; 10的二進制為1010,放入_a中,由于_a只有3bit,需要截斷,所以舍棄最高位1,放入010:

【詳解】C語言冷門知識點之--位段,C語言學習,c語言,開發(fā)語言,學習方法,c++

  • 執(zhí)行程序:a._b = 12;,12的二進制為1100,剛好可以放入,如下圖:
    【詳解】C語言冷門知識點之--位段,C語言學習,c語言,開發(fā)語言,學習方法,c++
  • 執(zhí)行程序:a._c = 3;,3的二進制為11,由于_c有5bit,高位添0,放入00011,如下圖:
    【詳解】C語言冷門知識點之--位段,C語言學習,c語言,開發(fā)語言,學習方法,c++
  • 執(zhí)行程序:a._d = 4;,4的二進制為100,放入0100,如下圖:
    【詳解】C語言冷門知識點之--位段,C語言學習,c語言,開發(fā)語言,學習方法,c++
  • 程序就基本執(zhí)行完了,那么內(nèi)存中是什么樣的呢?根據(jù)上面分析,我們一開始給結(jié)構(gòu)體初始化為0,我們可以得到:
    【詳解】C語言冷門知識點之--位段,C語言學習,c語言,開發(fā)語言,學習方法,c++
    ??由于機器是小端存儲,所以內(nèi)存上應(yīng)該是:62 03 04.
    經(jīng)過調(diào)試,可以看到:
    【詳解】C語言冷門知識點之--位段,C語言學習,c語言,開發(fā)語言,學習方法,c++

??以上也證明了, 在VS2022上,位段分配的內(nèi)存中的比特位是從右向左使用的,分配剩余的比特位不夠使用時,浪費掉剩余內(nèi)存,重新開辟新的空間。

當然,不同平臺得到的結(jié)果也可能會不同,這正是位段的缺點,可移植性差,接下來我們看看位段的跨平臺問題。

五,位段的跨平臺問題

  1. int 位段被當成有符號數(shù)還是無符號數(shù)是不確定的。
  2. 位段中最大位的數(shù)目不能確定。(16位機器最大16,32位機器最大32,寫成27,在16位機器會出問題)。
  3. 位段中的成員在內(nèi)存中從左向右分配還是從右向左分配的標準尚未定義。
  4. 當一個結(jié)構(gòu)包含兩個位段,第二個位段成員比較大,無法容納打一個位段剩余的位時,是舍棄剩余的位還是利用,這是不確定的。

總結(jié):跟結(jié)構(gòu)相比,位段可以達到同樣的效果,并且可以很好的節(jié)省空間,但是有跨平臺的問題存在。

六, 位段的應(yīng)用

位段由于跨平臺的問題,真正的用途的其中一個是計網(wǎng)的IP數(shù)據(jù)報:
【詳解】C語言冷門知識點之--位段,C語言學習,c語言,開發(fā)語言,學習方法,c++

? ?? 創(chuàng)作不易,你的點贊和關(guān)注都是對我莫大的鼓勵,再次感謝您的觀看??文章來源地址http://www.zghlxwxcb.cn/news/detail-568178.html

到了這里,關(guān)于【詳解】C語言冷門知識點之--位段的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔相關(guān)法律責任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • c語言位段知識詳解

    c語言位段知識詳解

    ? 本篇文章帶來 位段 相關(guān)知識詳細講解! 如果您覺得文章不錯,期待你的一鍵三連哦,你的鼓勵是我創(chuàng)作的動力之源,讓我們一起加油,一起奔跑,讓我們頂峰相見?。?! 目錄 一.什么是位段 二.位段的內(nèi)存分配 ?位段的好處 三.位段的跨平臺問題 四.位段的應(yīng)用 位段的聲明

    2024年02月15日
    瀏覽(14)
  • C語言知識點匯總

    C語言知識點匯總

    C語言知識點保姆級總結(jié),這不得進你的收藏夾吃灰?! 拖了很久的C語言所學知識的簡單小結(jié),內(nèi)容有點多,第一次總結(jié)也可能有錯誤或者不全面,歡迎隨時補充說明! ? 用不同數(shù)據(jù)類型所定義的變量所占空間大小不一樣,定義的變量不是保存于數(shù)據(jù)類型中,而是因為只有

    2024年01月23日
    瀏覽(26)
  • [知識點整理]中科院/國科大 自然語言處理nlp 期末考試知識點整理

    [知識點整理]中科院/國科大 自然語言處理nlp 期末考試知識點整理

    本文為2022秋網(wǎng)安學院的自然語言處理課程期末復習知識點整理,水平有限,整理的答案可能有錯誤或遺漏,歡迎大家指正。 文章的第二部分內(nèi)容參考了學校學姐的文章,文章寫的很好,大家可以關(guān)注她: (133條消息) 【一起入門NLP】中科院自然語言處理期末考試*總復習*:考

    2024年02月09日
    瀏覽(35)
  • 計算機語言知識點梳理

    python是一門強類型、動態(tài)型、解釋型語言語言 JavaScript是一門弱類型、動態(tài)性、解釋型語言 typescript是一門強類型、靜態(tài)型、編譯型語言 Java是一門強類型、靜態(tài)型、編譯型語言 變量大小寫區(qū)分 html css sql java javascript python typescript c 弱類型語言和強類型語言 強類型語言也稱為強

    2024年02月09日
    瀏覽(28)
  • 8086 匯編語言知識點梳理

    8086 匯編語言知識點梳理

    機器語言是機器指令的集合 機器指令是一臺機器可以正確執(zhí)行的命令 機器指令由一串二進制數(shù)表示 匯編語言的主體是匯編指令 匯編指令是機器指令便于記憶的書寫格式 匯編指令是機器指令的 助記符 匯編指令:機器碼的助記符,有對應(yīng)的機器碼 偽指令::沒有對應(yīng)的機器

    2024年02月08日
    瀏覽(56)
  • 詳解MVCC相關(guān)知識點

    詳解MVCC相關(guān)知識點

    前言:學習前,先敘述mysql相關(guān)基礎(chǔ)知識,一步步了解mysql底層機制。 數(shù)據(jù)庫事務(wù)的隔離級別有4個,由低到高依次為Read uncommitted?、Read committed、Repeatable read?、Serializable?,這四個級別可以逐個解決臟讀?、不可重復讀?、幻讀?這幾類問題。 √: 可能出現(xiàn)????×: 不會出現(xiàn)

    2024年02月06日
    瀏覽(23)
  • pgzero所有知識點詳解

    pgzero所有知識點詳解

    目錄 ?什么是pgzero? pgzero的安裝 4,正式開始! 1,調(diào)整背景色 2,導入角色 3,鼠標事件 5,按鍵事件 6,刷新功能 1,角色屬性 2,功能介紹 7,全局變量and局部變量 1,全局變量與局部變量的區(qū)別 2,全局變量如何在功能內(nèi)使用 8,角色功能及窗口功能 1,角色功能 2,窗口功

    2024年02月05日
    瀏覽(36)
  • 【C語言】指針知識點筆記(2)

    【C語言】指針知識點筆記(2)

    目錄 一、野指針 二、assert斷言 三、指針的使用和傳址調(diào)用 四、數(shù)組名的理解 五、使用指針訪問數(shù)組

    2024年01月18日
    瀏覽(23)
  • Spring AOP知識點詳解

    Spring AOP知識點詳解

    Spring AOP是 Spring最核心的能力,那到底什么是AOP呢,今天了不起帶大家了解一下。 AOP(Aspect Oriented Programming): 面向切面編程 ,是OOP(面向?qū)ο缶幊?的一個延續(xù),其和OOP一樣,也是一種編程思想,不過AOP是一種橫向開發(fā)模式。 OOP ,面向?qū)ο?,允許開發(fā)者定義縱向的關(guān)系,但并適

    2024年02月16日
    瀏覽(27)
  • 單片機----匯編語言入門知識點

    單片機----匯編語言入門知識點

    目錄 匯編語句的格式 匯編語句的兩個基本語句 子程序的調(diào)用 查表程序設(shè)計 1.x和y均為單字節(jié)數(shù)的查表程序設(shè)計 2.x為單字節(jié)數(shù)y為雙字節(jié)數(shù)的查表程序設(shè)計 3.x和y均為雙字節(jié)數(shù)的查表程序設(shè)計 分支轉(zhuǎn)移程序設(shè)計 1.單分支選擇結(jié)構(gòu) 2.多分支選擇結(jié)構(gòu) 循環(huán)程序設(shè)計 (1) 計數(shù)循環(huán)控

    2024年04月28日
    瀏覽(22)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包