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

C 語(yǔ)言關(guān)于聯(lián)合體的相關(guān)知識(shí)

 更新時(shí)間:2020年06月10日 16:52:07   作者:Matrix海子  
這篇文章主要介紹了C 語(yǔ)言關(guān)于聯(lián)合體的相關(guān)知識(shí),文中講解非常細(xì)致,代碼幫助大家更好的理解學(xué)習(xí),感興趣的朋友可以了解下

      當(dāng)多個(gè)數(shù)據(jù)需要共享內(nèi)存或者多個(gè)數(shù)據(jù)每次只取其一時(shí),可以利用聯(lián)合體(union)。在C Programming Language 一書(shū)中對(duì)于聯(lián)合體是這么描述的:

     1)聯(lián)合體是一個(gè)結(jié)構(gòu);

     2)它的所有成員相對(duì)于基地址的偏移量都為0;

     3)此結(jié)構(gòu)空間要大到足夠容納最"寬"的成員;

     4)其對(duì)齊方式要適合其中所有的成員;

下面解釋這四條描述:

     由于聯(lián)合體中的所有成員是共享一段內(nèi)存的,因此每個(gè)成員的存放首地址相對(duì)于于聯(lián)合體變量的基地址的偏移量為0,即所有成員的首地址都是一樣的。為了使得所有成員能夠共享一段內(nèi)存,因此該空間必須足夠容納這些成員中最寬的成員。對(duì)于這句“對(duì)齊方式要適合其中所有的成員”是指其必須符合所有成員的自身對(duì)齊方式。

下面舉例說(shuō)明:

如聯(lián)合體

union U
{
 char s[9];
 int n;
 double d;
};

s占9字節(jié),n占4字節(jié),d占8字節(jié),因此其至少需9字節(jié)的空間。然而其實(shí)際大小并不是9,用運(yùn)算符sizeof測(cè)試其大小為16.這是因?yàn)檫@里存在字節(jié)對(duì)齊的問(wèn)題,9既不能被4整除,也不能被8整除。因此補(bǔ)充字節(jié)到16,這樣就符合所有成員的自身對(duì)齊了。從這里可以看出聯(lián)合體所占的空間不僅取決于最寬成員,還跟所有成員有關(guān)系,即其大小必須滿足兩個(gè)條件:

1)大小足夠容納最寬的成員;

2)大小能被其包含的所有基本數(shù)據(jù)類型的大小所整除。

測(cè)試程序:

/*測(cè)試聯(lián)合體 2011.10.3*/

#include <iostream>
using namespace std;

union U1
{
 char s[9];
 int n;
 double d;
};

union U2
{
 char s[5];
 int n;
 double d;
};

int main(int argc, char *argv[])
{
 U1 u1;
 U2 u2;
 printf("%d\n",sizeof(u1));
 printf("%d\n",sizeof(u2));
 printf("0x%x\n",&u1);
 printf("0x%x\n",&u1.s);
 printf("0x%x\n",&u1.n);
 printf("0x%x\n",&u1.d);
 u1.n=1;
 printf("%d\n",u1.s[0]);
 printf("%lf\n",u1.d);
 unsigned char *p=(unsigned char *)&u1;
 printf("%d\n",*p);
 printf("%d\n",*(p+1));
 printf("%d\n",*(p+2));
 printf("%d\n",*(p+3));
 printf("%d\n",*(p+4));
 printf("%d\n",*(p+5));
 printf("%d\n",*(p+6));
 printf("%d\n",*(p+7));
 return 0;
}

輸出結(jié)果為:

16
8
0x22ff60
0x22ff60
0x22ff60
0x22ff60
1
0.000000
1
0
0
0
48
204
64
0

對(duì)于sizeof(u1)=16。因?yàn)閡1中s占9字節(jié),n占4字節(jié),d占8字節(jié),因此至少需要9字節(jié)。其包含的基本數(shù)據(jù)類型為char,int,double分別占1,4,8字節(jié),為了使u1所占空間的大小能被1,4,8整除,則需填充字節(jié)以到16,因此sizeof(u1)=16.

對(duì)于sizeof(u2)=8。因?yàn)閡2中s占5字節(jié),n占4字節(jié),d占8字節(jié),因此至少需要8字節(jié)。其包含的基本數(shù)據(jù)類型為char,int,double分別占1,4,8字節(jié),為了使u2所占空間的大小能被1,4,8整除,不需填充字節(jié),因?yàn)?本身就能滿足要求。因此sizeof(u2)=8。

從打印出的每個(gè)成員的基地址可以看出,聯(lián)合體中每個(gè)成員的基地址都相同,等于聯(lián)合體變量的首地址。

對(duì)u1.n=1,將u1的n賦值為1后,則該段內(nèi)存的前4個(gè)字節(jié)存儲(chǔ)的數(shù)據(jù)為00000001 00000000 00000000 00000000

因此取s[0]的數(shù)據(jù)表示取第一個(gè)單元的數(shù)據(jù),其整型值為1,所以打印出的結(jié)果為1.

至于打印出的d為0.000000愿意如下。由于已知該段內(nèi)存前4字節(jié)的單元存儲(chǔ)的數(shù)據(jù)為00000001 00000000 00000000 00000000,從上面打印結(jié)果48,204,64,0可以知道后面4個(gè)字節(jié)單元中的數(shù)據(jù)為00110000 11001100 01000000 00000000,因此其表示的二進(jìn) 制浮點(diǎn)數(shù)為

00000000 01000000 11001100 00110000 00000000 00000000 00000000 00000001

對(duì)于double型數(shù)據(jù),第63位0為符號(hào)位,62-52 00000000100為階碼,0000 11001100 00110000 00000000 00000000 00000000 00000001為尾數(shù),根據(jù)其值知道尾數(shù)值約為0,而階碼為4-1023=-1019,因此其表示的浮點(diǎn)數(shù)為1.0*2^(-1019)=0.00000000000......,因此輸出結(jié)果為0.000000。

以上就是C 語(yǔ)言關(guān)于聯(lián)合體的相關(guān)知識(shí)的詳細(xì)內(nèi)容,更多關(guān)于C語(yǔ)言 聯(lián)合體的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 詳解C++中特殊類設(shè)計(jì)

    詳解C++中特殊類設(shè)計(jì)

    這篇文章主要為大家詳細(xì)介紹了C++中關(guān)于特殊類設(shè)計(jì)的相關(guān)知識(shí),文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)C++有一定的幫助,感興趣的可以了解一下
    2023-07-07
  • visual studio2019的安裝以及使用圖文步驟詳解

    visual studio2019的安裝以及使用圖文步驟詳解

    這篇文章主要介紹了visual studio2019的安裝以及使用圖文步驟詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-03-03
  • C++類的定義和對(duì)象的創(chuàng)建詳解

    C++類的定義和對(duì)象的創(chuàng)建詳解

    本篇文章重點(diǎn)講解了兩種創(chuàng)建對(duì)象的方式:一種是在棧上創(chuàng)建,形式和定義普通變量類似;另外一種是在堆上使用 new 關(guān)鍵字創(chuàng)建,必須要用一個(gè)指針指向它,下面和小編一起來(lái)學(xué)習(xí)下面為文章的內(nèi)容
    2021-09-09
  • 淺談VC++中的內(nèi)聯(lián)

    淺談VC++中的內(nèi)聯(lián)

    在 Visual C++ 中使用內(nèi)聯(lián)匯編 一、內(nèi)聯(lián)匯編的優(yōu)缺點(diǎn) 因?yàn)樵赩isual C++中使用內(nèi)聯(lián)匯編不需要額外的編譯器和聯(lián)接器,且可以處理Visual C++ 中不能處理的一些事情,而且可以使用在 C/C++中的變量,所以非常方便。
    2015-07-07
  • C++運(yùn)算符重載的方法詳細(xì)解析

    C++運(yùn)算符重載的方法詳細(xì)解析

    運(yùn)算符重載的方法是定義一個(gè)重載運(yùn)算符的函數(shù),在需要執(zhí)行被重載的運(yùn)算符時(shí),系統(tǒng)就自動(dòng)調(diào)用該函數(shù),以實(shí)現(xiàn)相應(yīng)的運(yùn)算。也就是說(shuō),運(yùn)算符重載是通過(guò)定義函數(shù)實(shí)現(xiàn)的
    2013-10-10
  • C++模板基礎(chǔ)之函數(shù)模板與類模板實(shí)例詳解

    C++模板基礎(chǔ)之函數(shù)模板與類模板實(shí)例詳解

    C++ 除了支持函數(shù)模板,還支持類模板(Class Template),所以下面這篇文章主要給大家介紹了關(guān)于C++模板基礎(chǔ)之函數(shù)模板與類模板的相關(guān)資料,需要的朋友可以參考下
    2021-06-06
  • 優(yōu)先隊(duì)列(priority_queue)的C語(yǔ)言實(shí)現(xiàn)代碼

    優(yōu)先隊(duì)列(priority_queue)的C語(yǔ)言實(shí)現(xiàn)代碼

    本文簡(jiǎn)要介紹一種基于數(shù)組二叉堆實(shí)現(xiàn)的優(yōu)先隊(duì)列,定義的數(shù)據(jù)結(jié)構(gòu)和實(shí)現(xiàn)的函數(shù)接口說(shuō)明如下
    2013-10-10
  • 深入分析C++派生類中的保護(hù)成員繼承

    深入分析C++派生類中的保護(hù)成員繼承

    這篇文章主要介紹了C++派生類中的保護(hù)成員繼承,深入對(duì)C++面向?qū)ο缶幊痰睦^承機(jī)制進(jìn)行了解析,需要的朋友可以參考下
    2015-09-09
  • 如何利用C語(yǔ)言實(shí)現(xiàn)最簡(jiǎn)單的HTTP服務(wù)器詳解

    如何利用C語(yǔ)言實(shí)現(xiàn)最簡(jiǎn)單的HTTP服務(wù)器詳解

    這篇文章主要給大家介紹了關(guān)于如何利用C語(yǔ)言實(shí)現(xiàn)最簡(jiǎn)單的HTTP服務(wù)器的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用C語(yǔ)言具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-11-11
  • C語(yǔ)言數(shù)組應(yīng)用實(shí)現(xiàn)掃雷游戲

    C語(yǔ)言數(shù)組應(yīng)用實(shí)現(xiàn)掃雷游戲

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言數(shù)組應(yīng)用實(shí)現(xiàn)掃雷游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-06-06

最新評(píng)論

静宁县| 攀枝花市| 涿州市| 普兰店市| 河北区| 云梦县| 盐亭县| 纳雍县| 泰兴市| 仁怀市| 名山县| 浦北县| 泸溪县| 东莞市| 资兴市| 桦南县| 苗栗市| 大新县| 双鸭山市| 资兴市| 毕节市| 甘孜| 梧州市| 怀来县| 夹江县| 平度市| 梨树县| 布尔津县| 五指山市| 高清| 蓝田县| 南丰县| 沿河| 正定县| 荣昌县| 苏尼特左旗| 股票| 兰考县| 车致| 吉林省| 阿巴嘎旗|