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

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

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

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

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

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

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

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

下面解釋這四條描述:

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

下面舉例說明:

如聯(lián)合體

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

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

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

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

測試程序:

/*測試聯(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

對于sizeof(u1)=16。因為u1中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.

對于sizeof(u2)=8。因為u2中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é),因為8本身就能滿足要求。因此sizeof(u2)=8。

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

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

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

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

00000000 01000000 11001100 00110000 00000000 00000000 00000000 00000001

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

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

相關(guān)文章

  • C++ 詳細講解stack與queue的模擬實現(xiàn)

    C++ 詳細講解stack與queue的模擬實現(xiàn)

    C++ Stack(堆棧) 是一個容器類的改編,為程序員提供了堆棧的全部功能,也就是說實現(xiàn)了一個先進后出(FILO)的數(shù)據(jù)結(jié)構(gòu),許多程序都使用了 queue 容器。queue 容器可以用來表示超市的結(jié)賬隊列或服務(wù)器上等待執(zhí)行的數(shù)據(jù)庫事務(wù)隊列
    2022-04-04
  • C++ Boost實現(xiàn)異步端口掃描器詳解

    C++ Boost實現(xiàn)異步端口掃描器詳解

    端口掃描是一種用于識別目標(biāo)系統(tǒng)上哪些網(wǎng)絡(luò)端口處于開放、關(guān)閉或監(jiān)聽狀態(tài)的網(wǎng)絡(luò)活動,本文將運用Boost框架實現(xiàn)一個基于TCP的掃描工具,有需要的小伙伴可以參考下
    2023-11-11
  • C語言獲取Linux系統(tǒng)精確時間的方法

    C語言獲取Linux系統(tǒng)精確時間的方法

    下面小編就為大家?guī)硪黄狢語言獲取Linux系統(tǒng)精確時間的方法。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-09-09
  • C語言調(diào)試手段:鎖定錯誤的實現(xiàn)方法

    C語言調(diào)試手段:鎖定錯誤的實現(xiàn)方法

    本篇文章是對在C語言調(diào)試中,鎖定錯誤的方法進行了詳細的分析介紹,需要的朋友參考下
    2013-05-05
  • 解決C++ openCV無法讀取視頻但是可以讀取圖像的問題記錄

    解決C++ openCV無法讀取視頻但是可以讀取圖像的問題記錄

    在使用OpenCV的cv::VideoCapture讀取視頻文件時,可能會遇到無法讀取特定格式,如MP4的視頻文件的問題,本文介紹解決C++ openCV無法讀取視頻但是可以讀取圖像的問題記錄,感興趣的朋友跟隨小編一起看看吧
    2024-09-09
  • C語言通訊錄實例分享

    C語言通訊錄實例分享

    這篇文章主要為大家分享了C語言通訊錄實例,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-02-02
  • 詳解C語言動態(tài)內(nèi)存的分配

    詳解C語言動態(tài)內(nèi)存的分配

    這篇文章主要為大家介紹了C語言動態(tài)內(nèi)存的分配,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2021-12-12
  • C++17中的折疊表達式實現(xiàn)

    C++17中的折疊表達式實現(xiàn)

    這篇文章主要介紹了C++17中的折疊表達式實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-11-11
  • C++中stack容器的使用

    C++中stack容器的使用

    本文主要介紹了C++中stack容器的使用,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-03-03
  • C++程序操作文件對話框的方法

    C++程序操作文件對話框的方法

    這篇文章主要介紹了C++如何操作文件對話框,本文我們就來講述一下C++在操作文件夾對話框的相關(guān)細節(jié),給大家借鑒和參考,感興趣的朋友一起看看吧
    2022-06-06

最新評論