亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

C/C++位段超詳細整理大全

 更新時間:2024年01月11日 09:30:59   作者:貌美不及玲瓏心,賢妻扶我青云志  
以位為單位來定義結(jié)構(gòu)體中的成員變量所占的空間內(nèi)存,含有位段的結(jié)構(gòu)體稱為位段結(jié)構(gòu),這篇文章主要給大家介紹了關(guān)于C/C++位段的相關(guān)資料,需要的朋友可以參考下

什么是位段?

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

  • 位段的成員必須是 int、unsigned int 或signed int 等整型家族。
  • 位段的成員名后邊有一個冒號和一個數(shù)字

這是一個結(jié)構(gòu)體

struct S
{
	int a;
	int b;
	int c;
	int d;
};

這是一個位段

struct A
{
	int a : 2;
	int b : 5;
	int c : 10;
	int d : 30;
};

位段的樣子看起來奇奇怪怪的,那個冒號和后面的數(shù)字是什么意思呢?

位段位段,它名字里的“位”就是二進制位。

冒號和后面的數(shù)字其實是它的成員變量在告訴編譯器:

  • 成員a:我只需要2個比特的空間足以!
  • 成員b:請給我分配5個比特的空間吧!
  • 成員c:給我來10個!
  • 成員d:我需要的空間大,給我來40個比特的空間吧!

每個成員都得到了自己想要的大小的空間,那么位段A的總大小是多少呢?

我們用sizeof來計算一下:

#include<stdio.h>

struct S
{
	int a;
	int b;
	int c;
	int d;
};

struct A
{
	int a : 2;
	int b : 5;
	int c : 10;
	int d : 30;
};

int main()
{
	printf("結(jié)構(gòu)體S的大小為:  %d字節(jié)\n", sizeof(struct S));
	printf("位段A的大小為:     %d字節(jié)\n", sizeof(struct A));

	return 0;
}

學(xué)完上一章之后,我們很輕松的計算出結(jié)構(gòu)體S的大小4*4=16字節(jié)與結(jié)果一致。

再看位段,把成員們所需要的空間大小加起來2+5+10+30=47比特。

已知1字節(jié)=8比特。換算一下位段A的總大小應(yīng)該是6字節(jié)就夠了,可結(jié)果卻是8字節(jié)。

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

位段的成員可以是 int unsigned int signed int 或者是 char (屬于 整形家族 )類型。

位段的空間上是按照需要以4個字節(jié)( int )或者1個字節(jié)( char )的方式來開辟的。

位段涉及很多不確定因素,位段是不跨平臺的,注重 可移植的程序應(yīng)該避免使用位段 。

首先聲明:位段有很多用法是標(biāo)準(zhǔn)未定義的,也就是說不同的機器上或者不同的編譯器上內(nèi)存如何

分配都有所差異,所以一下內(nèi)容中有關(guān)內(nèi)存分配的插圖并不是嚴格正確的?。?!

舉個例子:

這是一個成員是int類型的位段:

struct A
{
	int a : 2;
	int b : 5;
	int c : 10;
	int d : 30;
};

這是一個成員是char類型的位段:

struct S
{
	char a : 3;
	char b : 4;
	char c : 5;
	char d : 4;
};

現(xiàn)在假定義一個位段的變量并進行初始化:

struct S
{
	char a : 3;
	char b : 4;
	char c : 5;
	char d : 4;
};
struct S s = { 0 };
s.a = 10;
s.b = 12;
s.c = 3;
s.d = 4;

其在VS2013環(huán)境下是這樣進行存儲數(shù)據(jù)的:

說明數(shù)據(jù)是以二進制的方式進行存儲的。

再次強調(diào):以上的存儲形式僅僅是vs2013環(huán)境下的,每種不同的編譯器在不同的環(huán)境下都有自己存儲的方式 。

位段的跨平臺問題

問題一:int 位段被當(dāng)成有符號數(shù)還是無符號數(shù)是不確定的。

說明:例如一個整型存儲的時候,它的最高位是有符號位還是無符號位是有明確的規(guī)定的,而位段標(biāo)準(zhǔn)并沒有規(guī)定。有的平臺會當(dāng)作有符號數(shù)處理,有的反之。

問題二:位段中最大位的數(shù)目不能確定。

說明:16位機器最大16,32位機器最大32,寫成27,在16位機器會出問題。

問題三:位段中的成員在內(nèi)存中從左向右分配,還是從右向左分配標(biāo)準(zhǔn)尚未定義。

說明:

問題四:當(dāng)一個結(jié)構(gòu)包含兩個位段,第二個位段成員比較大,無法容納于第一個位段剩余的位時,是舍棄剩余的位還是利用,這是不確定的。

說明:

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

總結(jié)

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

您可能感興趣的文章:

相關(guān)文章

  • C++實例分析講解臨時對象與右值引用的用法

    C++實例分析講解臨時對象與右值引用的用法

    對性能來說,許多的問題都需要和出現(xiàn)頻率及本身執(zhí)行一次的開銷掛鉤,有些問題雖然看似比較開銷較大,但是很少會執(zhí)行到,那也不會對程序有大的影響;同樣一個很小開銷的函數(shù)執(zhí)行很頻繁,同樣會對程序的執(zhí)行效率有很大影響。本章中作者主要根據(jù)臨時對象來闡述這樣一個觀點
    2022-08-08
  • 基于Protobuf C++ serialize到char*的實現(xiàn)方法分析

    基于Protobuf C++ serialize到char*的實現(xiàn)方法分析

    本篇文章是對Protobuf C++ serialize到char*的實現(xiàn)方法進行了詳細的分析介紹。需要的朋友參考下
    2013-05-05
  • C語言中strspn()函數(shù)和strcspn()函數(shù)的對比使用

    C語言中strspn()函數(shù)和strcspn()函數(shù)的對比使用

    這篇文章主要介紹了C語言中strspn()函數(shù)和strcspn()函數(shù)的對比使用,strspn是計算屬于字符串的字符數(shù)而strcspn則是判斷不屬于,需要的朋友可以參考下
    2015-08-08
  • C語言函數(shù)棧幀的創(chuàng)建和銷毀詳解

    C語言函數(shù)棧幀的創(chuàng)建和銷毀詳解

    這篇文章主要為大家詳細介紹了C語言函數(shù)棧幀的創(chuàng)建和銷毀,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-02-02
  • Visual Studio 2019 Professional 激活方法詳解

    Visual Studio 2019 Professional 激活方法詳解

    這篇文章主要介紹了Visual Studio 2019 Professional 激活方法,本文通過實例代碼給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-05-05
  • 用標(biāo)準(zhǔn)c++實現(xiàn)string與各種類型之間的轉(zhuǎn)換

    用標(biāo)準(zhǔn)c++實現(xiàn)string與各種類型之間的轉(zhuǎn)換

    這個類在頭文件中定義, < sstream>庫定義了三種類:istringstream、ostringstream和stringstream,分別用來進行流的輸入、輸出和輸入輸出操作。另外,每個類都有一個對應(yīng)的寬字符集版本
    2013-09-09
  • C++編寫的WebSocket服務(wù)端客戶端實現(xiàn)示例代碼

    C++編寫的WebSocket服務(wù)端客戶端實現(xiàn)示例代碼

    本文主要介紹了C++編寫的WebSocket服務(wù)端客戶端實現(xiàn)示例代碼,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-10-10
  • C++實現(xiàn)LeetCode(110.平衡二叉樹)

    C++實現(xiàn)LeetCode(110.平衡二叉樹)

    這篇文章主要介紹了C++實現(xiàn)LeetCode(110.平衡二叉樹),本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細內(nèi)容,需要的朋友可以參考下
    2021-07-07
  • C++無符號整數(shù)溢出問題解析

    C++無符號整數(shù)溢出問題解析

    這篇文章主要介紹了C++無符號整數(shù)溢出探究,本文主要探討C/C++中無符號整數(shù)超過范圍后的計算問題,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-06-06
  • C語言關(guān)鍵字大全(共32個)

    C語言關(guān)鍵字大全(共32個)

    這篇文章主要分享下C語言的32個關(guān)鍵字,需要的朋友可以參考下
    2013-07-07

最新評論