最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C語言快速掌握位段使用

 更新時間:2022年09月23日 08:34:53   作者:暴躁小程序猿  
位段位段的聲明和結構是類似的,但是也會有所不同,此篇文章將帶你了解位段是什么已以及位段的使用和位段的特性,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習吧

一、位段是什么

位段的聲明和結構是類似的,有兩個不同

1.位段的成員必須是 int、unsigned int 或signed int 。

2.位段的成員名后邊有一個冒號和一個數(shù)字。

舉例如下:

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

這個A就是一個位段。

但是結構體可以根據(jù)結構體內存對齊確定一個結構體的大小,但是位段的大小怎么確定呢?

位段A的大小是多少呢?

printf("%d\n", sizeof(struct A));

我們利用sizeof操作符來測一下這個A位段的大小是8個字節(jié)

但是根據(jù)常理來說應該是16個字節(jié)呀,我們和結構體對比分析

struct s
{
    int a;
    int b;
    int c;
    int d;
    };
   int main()
   {
     printf("%d\n", sizeof(struct s));//16個字節(jié)
     return 0;
     }

對比發(fā)現(xiàn)位段不是根據(jù)他的數(shù)據(jù)類型來分配內存的。接下來我們看看位段是怎么分配內存的。

二、位段的內存分配

2.1位段內存分配的原則

  1. 位段的成員可以是 int unsigned int signed int 或者是 char (屬于整形家族)類型
  2. 位段的空間上是按照需要以4個字節(jié)( int )或者1個字節(jié)( char )的方式來開辟的。
  3. 位段涉及很多不確定因素,位段是不跨平臺的,注重可移植的程序應該避免使用位段。ps:雖然位段是不跨平臺的,但是我們可以根據(jù)平臺的不同編寫不同的代碼
struct A
{
    int _a:2;     //雖然a是int型但是他所分配的內存根據(jù)冒號之后的數(shù)字確定,a冒號后面是2,所以他只占用2個比特位
    int _b:5;    //同理,b成員只需要5個比特位
    int _c:10;    //10個比特位
    int _d:30;    //30個比特位
    };

  那么我們發(fā)現(xiàn)這個字段A一共需要47個比特位,好像6個字節(jié)就可以完成存儲,但是事實并非如此,我們根據(jù)位段的內存分配原則,位段的成員是int類型所以按照需要以4個字節(jié)的方式開辟,我們先開辟4個字節(jié)的空間,即32個比特位,我們可以存儲a,b,c但是存儲d的時候發(fā)現(xiàn)內存不夠了,我們再次按照需求再一次開辟4個字節(jié)的空間,最終開辟了8個字節(jié)的空間而非6個字節(jié)的空間來存儲位段A。

  但是a,b,c存儲之后還剩下15個比特位,這些比特位還用不用呢?

  答案是不確定的,每個編譯器的處理方式都是不一樣的,在VS環(huán)境下就浪費掉了,位段依舊有很多的不確定性。下面用圖例理想表示一下在VS環(huán)境下位段的存儲:

代碼如下:

#define  _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
struct S
{
  	char a : 3;    //a占3個比特位,以下同理
  	char b : 4;    
  	char c : 5;
  	char d : 4;
};
int main()
{
//printf("%d\n", sizeof(struct S));
	struct S s = { 0 };
	s.a = 10;       // 賦值給位段的成員
	s.b = 12;
	s.c = 3;
	s.d = 4;
  return 0;
}

2.2位段內存分配圖解

假設內存都是由低位向高位使用的,即從右向左使用:

我們將這3個字節(jié)的內存中都用0進行初始化:

struct S s = {<!--{C}%3C!%2D%2D%20%2D%2D%3E--> 0 };

三、位段的跨平臺問題

int 位段被當成有符號數(shù)還是無符號數(shù)是不確定的。

int的最高位原本是符號位,但是int位段是有符號數(shù)還是無符號數(shù)是不確定的。位段中最大位的數(shù)目不能確定。(16位機器最大16,32位機器最大32,寫成27,在16位機器會出問題。

(16位機器最大可以處理16位數(shù)據(jù),尋址空間也只有16位,但是如果傳入27位數(shù)據(jù)就會出問題)

ps:int在16位操作系統(tǒng)下占2個字節(jié)。位段中的成員在內存中從左向右分配,還是從右向左分配標準尚未定義。

上圖只是假設我們從右向左使用,但是分配表示尚未定義,所以也是不確定的。當一個結構包含兩個位段,第二個位段成員比較大,無法容納于第一個位段剩余的位時,是舍棄剩余的位還是利用,這是不確定的。

總結:

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

  犧牲了它的可移植性,但是節(jié)省了空間,可以根據(jù)需求選擇。

  為什么說和結構相比,位段可以節(jié)省空間呢?

代碼如下(示例):

struct A
{
    int _a:2;     //雖然a是int型但是他所分配的內存根據(jù)冒號之后的數(shù)字確定,a冒號后面是2,所以他只占用2個比特位
    int _b:5;    //同理,b成員只需要5個比特位
    int _c:10;    //10個比特位
    int _d:30;    //30個比特位
    };

  比如這個代碼,假設a的取值只可能是0,1,2,3,如果用結構寫的話會給a分配4個字節(jié)的空間也就是32個比特位,但是a最大需要的比特位是2位,所以會大大造成浪費,并且結構體還存在結構體內存對齊問題,犧牲了空間提高了時間效率。

四、位段的使用

總結

  位段的介紹到此結束,總結一下就是位段相比較結構體節(jié)省了空間但是失去了可移植性,存在了跨平臺的問題,我們可以根據(jù)自身的需求來選擇是否使用位段,同時位段廣泛使用在計算機網(wǎng)絡方面,如果想變強就需要學會合理使用位段,加油 少年們!

到此這篇關于C語言快速掌握位段使用的文章就介紹到這了,更多相關C語言位段內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • MinGW-w64 C/C++編譯器下載和安裝的方法步驟(入門教程)

    MinGW-w64 C/C++編譯器下載和安裝的方法步驟(入門教程)

    如果電腦沒有安裝MinGW-w64 C/C++編譯器,就無法運行gcc命令,本文主要介紹了MinGW-w64 C/C++編譯器下載和安裝的方法步驟,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-02-02
  • 下標操作符重載模擬多維數(shù)組詳解

    下標操作符重載模擬多維數(shù)組詳解

    雖然不能直接實現(xiàn)一對下標操作符重載,但是我們可以間接模擬。思路是這樣的,先通過單下標操作返回一個具有下標操作能力的左值,對左值進行下標操作,兩個下標操作表達式聯(lián)立就實現(xiàn)了雙下標操作
    2013-09-09
  • C/C++回調函數(shù)介紹

    C/C++回調函數(shù)介紹

    回調函數(shù)就是一個通過函數(shù)指針調用的函數(shù)。如果你把函數(shù)的指針(地址)作為參數(shù)傳遞給另一個函數(shù),當這個指針被用為調用它所指向的函數(shù)時,我們就說這是回調函數(shù)
    2013-10-10
  • C語言開發(fā)中的常見錯誤詳解

    C語言開發(fā)中的常見錯誤詳解

    這個分欄是對于使用C語言編程過程中可能會出現(xiàn)的一些錯誤而進行的說明,更多的錯誤示例將會在后面的內容里進行演示。希望這個分欄的內容可以幫助剛學編程的小白少走一些彎路,以及吸取更多的編碼經(jīng)驗
    2022-05-05
  • C語言字符串左旋的兩種實現(xiàn)方法

    C語言字符串左旋的兩種實現(xiàn)方法

    匯編語言中有一種移位指令叫做循環(huán)左移(ROL),下面這篇文章主要給大家介紹了關于C語言字符串左旋的兩種實現(xiàn)方法,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2023-02-02
  • 淺談C語言Free空指針會怎樣

    淺談C語言Free空指針會怎樣

    在C語言中,使用free函數(shù)釋放一個空指針是安全的,不會引發(fā)任何錯誤或異常,本文就來詳細的介紹一下,具有一定的參考價值,感興趣的可以了解一下
    2023-10-10
  • C語言數(shù)據(jù)的存儲專項分析

    C語言數(shù)據(jù)的存儲專項分析

    使用編程語言進行編程時,需要用到各種變量來存儲各種信息。變量保留的是它所存儲的值的內存位置。這意味著,當您創(chuàng)建一個變量時,就會在內存中保留一些空間。您可能需要存儲各種數(shù)據(jù)類型的信息,操作系統(tǒng)會根據(jù)變量的數(shù)據(jù)類型,來分配內存和決定在保留內存中存儲什么
    2022-07-07
  • C++11 模板參數(shù)的“右值引用”是轉發(fā)引用嗎

    C++11 模板參數(shù)的“右值引用”是轉發(fā)引用嗎

    這篇文章主要介紹了C++11 模板參數(shù)的“右值引用”是轉發(fā)引用嗎,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-05-05
  • QT實現(xiàn)QMessageBox中文按鈕示例詳解

    QT實現(xiàn)QMessageBox中文按鈕示例詳解

    這篇文章主要為大家詳細介紹了QT實現(xiàn)QMessageBox中文按鈕的相關知識,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學習一下
    2024-11-11
  • C++學習筆記之pimpl用法詳解

    C++學習筆記之pimpl用法詳解

    在編寫穩(wěn)定代碼是,管理好代碼間的依賴性是不可缺少的一個環(huán)節(jié)。特別是庫文件的編寫中,減少代碼間的依賴性可以提供一個“干凈”的接口。下面這篇文章主要給大家介紹了關于C++中pimpl用法的相關資料,需要的朋友可以參考下。
    2017-08-08

最新評論

遂昌县| 珲春市| 安义县| 荣成市| 临澧县| 中牟县| 饶阳县| 那坡县| 靖江市| 嘉鱼县| 阿拉善盟| 苍南县| 洛扎县| 石城县| 巴里| 普兰店市| 井陉县| 孝感市| 玉溪市| 漯河市| 陆河县| 嘉鱼县| 麟游县| 巴东县| 民县| 若尔盖县| 谢通门县| 彭阳县| 留坝县| 札达县| 读书| 肥东县| 普格县| 库伦旗| 龙胜| 鄢陵县| 咸阳市| 湖口县| 陆河县| 监利县| 陇南市|