欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C語言快速掌握位段使用

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

一、位段是什么

位段的聲明和結(jié)構(gòu)是類似的,有兩個(gè)不同

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

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

舉例如下:

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

這個(gè)A就是一個(gè)位段。

但是結(jié)構(gòu)體可以根據(jù)結(jié)構(gòu)體內(nèi)存對(duì)齊確定一個(gè)結(jié)構(gòu)體的大小,但是位段的大小怎么確定呢?

位段A的大小是多少呢?

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

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

但是根據(jù)常理來說應(yīng)該是16個(gè)字節(jié)呀,我們和結(jié)構(gòu)體對(duì)比分析

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

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

二、位段的內(nèi)存分配

2.1位段內(nèi)存分配的原則

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

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

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

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

代碼如下:

#define  _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
struct S
{
  	char a : 3;    //a占3個(gè)比特位,以下同理
  	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位段內(nèi)存分配圖解

假設(shè)內(nèi)存都是由低位向高位使用的,即從右向左使用:

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

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

三、位段的跨平臺(tái)問題

int 位段被當(dāng)成有符號(hào)數(shù)還是無符號(hào)數(shù)是不確定的。

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

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

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

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

總結(jié):

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

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

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

代碼如下(示例):

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

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

四、位段的使用

總結(jié)

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

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

相關(guān)文章

  • C++實(shí)現(xiàn)主機(jī)字節(jié)序和網(wǎng)絡(luò)字節(jié)序轉(zhuǎn)換示例

    C++實(shí)現(xiàn)主機(jī)字節(jié)序和網(wǎng)絡(luò)字節(jié)序轉(zhuǎn)換示例

    這篇文章主要為大家介紹了C++實(shí)現(xiàn)主機(jī)字節(jié)序和網(wǎng)絡(luò)字節(jié)序轉(zhuǎn)換示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-11-11
  • C語言 自定義類型全面系統(tǒng)理解

    C語言 自定義類型全面系統(tǒng)理解

    在C語言中自定義類型主要有結(jié)構(gòu)體類型、位段、枚舉類型、聯(lián)合體類型,自定義類型是面試常會(huì)碰到的內(nèi)容,本篇文章帶你徹底解決自定義類型
    2022-02-02
  • C語言中的sscanf()函數(shù)使用

    C語言中的sscanf()函數(shù)使用

    本文主要介紹了C語言中的sscanf()函數(shù)使用,sscanf通常被用來解析并轉(zhuǎn)換字符串,可以實(shí)現(xiàn)很強(qiáng)大的字符串解析功能,下面就一起來了解一下
    2023-05-05
  • Qt圖形圖像開發(fā)曲線圖表模塊QChart庫縮放/平移詳細(xì)方法與實(shí)例

    Qt圖形圖像開發(fā)曲線圖表模塊QChart庫縮放/平移詳細(xì)方法與實(shí)例

    這篇文章主要介紹了Qt圖形圖像開發(fā)曲線圖表模塊QChart庫縮放/平移詳細(xì)方法與實(shí)例,需要的朋友可以參考下
    2020-03-03
  • C++ const和指針詳情

    C++ const和指針詳情

    這篇文章主要介紹了C++ const和指針,關(guān)于使用const來修飾指針,有兩種不同的方式。第一種是讓指針指向一個(gè)常量對(duì)象,這樣可以防止使用該指針進(jìn)行修改指向的值。第二種則是將指針本身聲明為常量,可以防止改變指針指向的位置,下面來看看文章的詳細(xì)內(nèi)容
    2021-11-11
  • MFC對(duì)話框?qū)崿F(xiàn)梯形分頁

    MFC對(duì)話框?qū)崿F(xiàn)梯形分頁

    這篇文章主要為大家詳細(xì)介紹了MFC對(duì)話框?qū)崿F(xiàn)梯形分頁,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-06-06
  • Embarcadero?Dev-C++輸出中文亂碼問題圖文詳解

    Embarcadero?Dev-C++輸出中文亂碼問題圖文詳解

    Dev-C++(或者叫做 Dev-Cpp)是Windows環(huán)境下的一個(gè)輕量級(jí)C/C++ 集成開發(fā)環(huán)境(IDE),下面這篇文章主要給大家介紹了關(guān)于Embarcadero?Dev-C++輸出中文亂碼問題的相關(guān)資料,需要的朋友可以參考下
    2023-01-01
  • 一篇文章帶你實(shí)現(xiàn)C語言中常用庫函數(shù)的模擬

    一篇文章帶你實(shí)現(xiàn)C語言中常用庫函數(shù)的模擬

    這篇文章主要介紹了C語言中常用庫函數(shù)的模擬,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-09-09
  • C++如何實(shí)現(xiàn)BitMap數(shù)據(jù)結(jié)構(gòu)

    C++如何實(shí)現(xiàn)BitMap數(shù)據(jù)結(jié)構(gòu)

    這篇文章主要介紹了C++如何實(shí)現(xiàn)BitMap數(shù)據(jù)結(jié)構(gòu),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-07-07
  • C++設(shè)計(jì)模式之Static Factory模式詳解

    C++設(shè)計(jì)模式之Static Factory模式詳解

    這篇文章主要為大家詳細(xì)介紹了C++設(shè)計(jì)模式之Static Factory模式的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-07-07

最新評(píng)論