電子產(chǎn)業(yè)一站式賦能平臺(tái)

PCB聯(lián)盟網(wǎng)

搜索
查看: 29|回復(fù): 0
收起左側(cè)

如何使用union處理浮點(diǎn)數(shù)據(jù)?

[復(fù)制鏈接]

193

主題

193

帖子

1532

積分

三級(jí)會(huì)員

Rank: 3Rank: 3

積分
1532
跳轉(zhuǎn)到指定樓層
樓主
發(fā)表于 2023-5-14 14:00:00 | 只看該作者 |只看大圖 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式

關(guān)注、星標(biāo)公眾號(hào),直達(dá)精彩內(nèi)容
聯(lián)合體(union)的使用和分析1、聯(lián)合體聯(lián)合體(union)與結(jié)構(gòu)體(struct)有一些相似之處。但兩者有本質(zhì)上的不同。在結(jié)構(gòu)體中,各成員有各自的內(nèi)存空間, 一個(gè)結(jié)構(gòu)變量的總長(zhǎng)度是各成員長(zhǎng)度之和。而在聯(lián)合體中,各成員共享一段內(nèi)存空間, 一個(gè)聯(lián)合變量的長(zhǎng)度等于各成員中最長(zhǎng)的長(zhǎng)度。應(yīng)該說(shuō)明的是, 這里所謂的共享不是指把多個(gè)成員同時(shí)裝入一個(gè)聯(lián)合變量?jī)?nèi), 而是指該聯(lián)合變量可被賦予任一成員值,但每次只能賦一種值, 賦入新值則沖去舊值。
2、聲明共用體類型一個(gè)聯(lián)合體類型必須經(jīng)過(guò)定義之后, 才能使用它,才能把一個(gè)變量聲明定義為該聯(lián)合體類型。
聯(lián)合變量的聲明和結(jié)構(gòu)變量的聲明方式相同, 也有三種形式。
一般形式具體如下:
union 共用體名
{
   //成員列表
   數(shù)據(jù)類型 成員名;
   數(shù)據(jù)類型 成員名;
   ....
}
示例:
union _MQ
{
char data8[4];
int  data32;
};
3、定義共用體變量一般形式具體如下:
union _MQ
{
char data8[4];
int  data32;
};
//定義共用體變量
union _MQ mq;
合并簡(jiǎn)化形式具體如下:
union _MQ
{
char data8[4];
int  data32;
}mq;
匿名結(jié)構(gòu)體形式具體如下:
union
{
char data8[4];
int  data32;
}mq;
使用 typedef 聲明共用體類型,再定義共用體變量:
typedef union MQ
{
char data8[4];
int  data32;
} _MQ;
//定義共用體變量,以下兩種效果一樣
union MQ mq;
_MQ mq;
4、上代碼:#include
  
union Test {
        unsigned char a;
        unsigned short b;
        unsigned int c;
};

int main(void)
{
        union Test test;
        printf("%lu
", sizeof(union Test));
        printf("%lu
", sizeof(test));
        printf("&test = %p, &test.a = %p, &test.b = %p, &test.c = %p
", &test, &test.a, &test.b, &test.c);
        test.c = 0x11223344;
        printf("test.c = %x
", test.c);
        printf("test.a = %x
", test.a);
        printf("test.b = %x
", test.b);
        test.a = 0x88;
        printf("test.c = %x
", test.c);
        printf("test.a = %x
", test.a);
        printf("test.b = %x
", test.b);
        return 0;
}
結(jié)果:
4
4
&test = 0x7fff4a0708c4, &test.a = 0x7fff4a0708c4, &test.b = 0x7fff4a0708c4, &test.c = 0x7fff4a0708c4
test.c = 11223344
test.a = 44
test.b = 3344
test.c = 11223388
test.a = 88
test.b = 3388
結(jié)果分析:
1、聯(lián)合體的大小為最大成員的大小,在聯(lián)合體union Test中unsigned int是最大的占4個(gè)字節(jié)。
2、聯(lián)合體共用一塊內(nèi)存,其內(nèi)存大小為最大成員的內(nèi)存大小,所以所以成員的地址都一樣,&test = &test.a = &test.b = &test.c。
3、給聯(lián)合體某個(gè)成員賦值時(shí)會(huì)影響到另外一個(gè)成員的數(shù)值,如下圖:

發(fā)表回復(fù)

本版積分規(guī)則


聯(lián)系客服 關(guān)注微信 下載APP 返回頂部 返回列表