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

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

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

什么是位段?

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

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

這是一個結構體

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

這是一個位段

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

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

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

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

  • 成員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("結構體S的大小為:  %d字節(jié)\n", sizeof(struct S));
	printf("位段A的大小為:     %d字節(jié)\n", sizeof(struct A));

	return 0;
}

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

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

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

位段的內存分配

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

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

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

首先聲明:位段有很多用法是標準未定義的,也就是說不同的機器上或者不同的編譯器上內存如何

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

舉個例子:

這是一個成員是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)境下是這樣進行存儲數據的:

說明數據是以二進制的方式進行存儲的

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

位段的跨平臺問題

問題一:int 位段被當成有符號數還是無符號數是不確定的。

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

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

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

問題三:位段中的成員在內存中從左向右分配,還是從右向左分配標準尚未定義。

說明:

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

說明:

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

總結

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

相關文章

  • C/C++?Qt?StatusBar底部狀態(tài)欄應用教程

    C/C++?Qt?StatusBar底部狀態(tài)欄應用教程

    Qt窗體中默認會附加一個QstatusBar組件,狀態(tài)欄組件位于主窗體的最下方,其作用是提供一個工具提示功能。本文主要介紹了StatusBar底部狀態(tài)欄的應用教程,需要的同學可以學習一下
    2021-12-12
  • C語言數組的各種操作梳理

    C語言數組的各種操作梳理

    數組是一組有序的數據的集合,數組中元素類型相同,由數組名和下標唯一地確定,數組中數據不僅數據類型相同,而且在計算機內存里連續(xù)存放,地址編號最低的存儲單元存放數組的起始元素,地址編號最高的存儲單元存放數組的最后一個元素
    2022-04-04
  • c++string字符串的比較是否相等問題

    c++string字符串的比較是否相等問題

    這篇文章主要介紹了c++string字符串的比較是否相等問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-08-08
  • C語言 makefile學習及實現(xiàn)實例

    C語言 makefile學習及實現(xiàn)實例

    這篇文章主要介紹了C語言 makefile學習及實現(xiàn)實例的相關資料,需要的朋友可以參考下
    2017-03-03
  • C++構造和解析Json的使用示例

    C++構造和解析Json的使用示例

    今天小編就為大家分享一篇關于C++構造和解析Json的使用示例,小編覺得內容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2018-12-12
  • Qt之QTimer使用及技巧小結

    Qt之QTimer使用及技巧小結

    QTimer是Qt中的定時器類,用于執(zhí)行定時操作,如在一段時間間隔后觸發(fā)某個槽函數或執(zhí)行特定的代碼,下面就來介紹一下Qt之QTimer使用及技巧小結,感興趣的可以了解一下
    2023-10-10
  • C語言實現(xiàn)opencv提取直線、輪廓及ROI實例詳解

    C語言實現(xiàn)opencv提取直線、輪廓及ROI實例詳解

    這篇文章主要介紹了C語言實現(xiàn)opencv提取直線、輪廓及ROI實例詳解,具有一定借鑒價值,需要的朋友可以參考下
    2018-01-01
  • C++連接mysql數據庫并讀取數據的具體步驟

    C++連接mysql數據庫并讀取數據的具體步驟

    在實際開發(fā)中我們經常需要對數據庫進行訪問,針對不同類型的數據庫(如MySQL、sqLite、Access、Excel等),如果采用不同的方法進行連接,會把我們搞崩潰,下面這篇文章主要給大家介紹了關于C++連接mysql數據庫并讀取數據的具體步驟,需要的朋友可以參考下
    2023-04-04
  • C語言詳細講解const的用法

    C語言詳細講解const的用法

    今天探討const,首先來說是將變量常量化。為什么要將變量常量化,原因有諸多好處有諸多。比如可以使數據更加安全不會被修改
    2022-05-05
  • C++ 中回調函數詳解及簡單實例

    C++ 中回調函數詳解及簡單實例

    這篇文章主要介紹了C++ 中回調函數詳解及簡單實例的相關資料,需要的朋友可以參考下
    2017-06-06

最新評論