乾貨分享 | C語言的聯合體
1、聯合體介紹
我們知道結構體(Struct)是一種構造型別或複雜型別,它可以包含多個型別不同的成員。在 C語言 中,還有另外一種和結構體非常類似的語法,叫做共用體(Union),它的定義格式為:
union 共用體名{ 成員列表 };
共用體有時也被稱為聯合或者聯合體,這也是 Union 這個單詞的本意。
結構體和共用體的區別在於:結構體的各個成員會佔用不同的記憶體,互相之間沒有影響;而共用體的所
有成員佔用同一段記憶體,修改一個成員會影響其餘所有成員。
結構體佔用的記憶體大於等於所有成員佔用的記憶體的總和(成員之間可能會存在縫隙),共用體佔用的內
存等於最長的成員佔用的記憶體。共用體使用了記憶體覆蓋技術,同一時刻只能儲存一個成員的值,如果對
新的成員賦值,就會把原來成員的值覆蓋掉。
#include "stdafx.h" #include <stdlib.h> #include <stdio.h> union data{ int n; char ch; short m; }; int main(){ union data a; printf("sizeof(a) = %d\n", sizeof(a)); a.n = 0x11; printf("n=%X, ch=%X, m=%X\n", a.n, a.ch, a.m); a.ch = 0x66; printf("n=%X, ch=%X, m=%X\n", a.n, a.ch, a.m); a.m = 0x5577; printf("n=%X, ch=%X, m=%X\n", a.n, a.ch, a.m); a.n = 0x11226677; printf("n=%X, ch=%X, m=%X\n", a.n, a.ch, a.m); system("pause"); return 0; }
執行結果:
3、聯合使用
舉一個MCP2518FD 晶片的例子:先看一下CAN幀格式:
<1img src=" normal"="" width="1004" style="display: block; vertical-align: middle; border: none; padding: 0px; margin: 0px auto; box-sizing: border-box; cursor: zoom-in; max-width: 100%; background-color: transparent; animation: 0.5s ease-in 0s 1 normal none running fxRichTextFadeIn;">
//佔用4個位元組 typedef struct _CAN_MSGOBJ_ID { uint32_t SID : 11; uint32_t EID : 18;uint32_t SID11 : 1; uint32_t unimplemented1 : 2; } CAN_MSGOBJ_ID; //佔用4個位元組 typedef struct _CAN_TX_MSGOBJ_CTRL { uint32_t DLC : 4; uint32_t IDE : 1; uint32_t RTR : 1; uint32_t BRS : 1; uint32_t FDF : 1; uint32_t ESI : 1; #ifdef MCP2517FD uint32_t SEQ : 7; uint32_t unimplemented1 : 16; #else uint32_t SEQ : 23; #endif } CAN_TX_MSGOBJ_CTRL; //佔用4個位元組 typedef uint32_t CAN_MSG_TIMESTAMP;//沒有用到 typedef union _CAN_TX_MSGOBJ { struct { CAN_MSGOBJ_ID id; //佔4個位元組 CAN_TX_MSGOBJ_CTRL ctrl; //佔4個位元組 CAN_MSG_TIMESTAMP timeStamp;//佔4個位元組 } bF; //共享12個位元組 uint32_t word[3];//共享12個位元組 uint8_t byte[12];//共享12個位元組 } CAN_TX_MSGOBJ; txObj.bF.id.SID = CAN_TX_ID; txObj.bF.ctrl.DLC = CAN_DLC_4;//傳送的資料長度 txObj.bF.ctrl.IDE = 0;//識別符號擴充套件位,在擴充套件幀中恆為隱性1,在標準幀中,IDE位於控制段,且 恆為顯性0 txObj.bF.ctrl.BRS = 0;//BRS(Bit Rate Switch)位速率轉換開關,當BRS為顯性位時資料段的位 速率與仲裁段的位速率一致,當BRS為隱性位時資料段的位速率高於仲裁段的位速率 txObj.bF.ctrl.FDF = 0;//擴充套件資料長度,在標準的CAN幀中,控制場包含的保留位被指定為顯性位發 送,但是在CAN-FD幀中以隱性位傳送,主要用於區分標準CAN幀格式和CAN-FD的幀格式 n = DRV_CANFDSPI_DlcToDataBytes(CAN_DLC_4); for (i = 0; i < n; i++) { txd[i] = Count; Count++; }uint8_t txBuffer[MAX_MSG_SIZE]; txBuffer[0] = txObj->byte[0]; //not using 'for' to reduce no of instructions txBuffer[1] = txObj->byte[1]; txBuffer[2] = txObj->byte[2]; txBuffer[3] = txObj->byte[3]; txBuffer[4] = txObj->byte[4]; txBuffer[5] = txObj->byte[5]; txBuffer[6] = txObj->byte[6]; txBuffer[7] = txObj->byte[7]; uint8_t i; for (i = 0; i < txdNumBytes; i++) { txBuffer[i + 8] = txd[i]; } // Make sure we write a multiple of 4 bytes to RAM uint16_t n = 0; uint8_t j = 0; if (txdNumBytes % 4) { // Need to add bytes n = 4 - (txdNumBytes % 4); i = txdNumBytes + 8; for (j = 0; j < n; j++) { txBuffer[i + 8 + j] = 0; } } spiTransferError = DRV_CANFDSPI_WriteByteArray(index, a, txBuffer, txdNumBytes + 8 + n); if (spiTransferError) { return -4; } // Set UINC and TXREQ spiTransferError = DRV_CANFDSPI_TransmitChannelUpdate(index, channel, flush); if (spiTransferError) { return -5; } return spiTransferError;
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69989353/viewspace-2765432/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 乾貨分享:六個知名的Go語言web框架GoWeb框架
- 【乾貨分享】C# 實體類生成工具C#
- C語言實現多級濾波—乾貨C語言
- 【乾貨】200個c語言例項的yuan碼C語言
- 乾貨來臨:C語言面試54題附答案C語言面試
- 如何系統學習C 語言(中)之 聯合體、列舉篇
- 分享乾貨啦!
- C語言的本質(32)——C語言與彙編之C語言內聯彙編C語言
- 乾貨!什麼是自然語言分析(NLA)
- Android NDK開發之旅6 C語言基礎 聯合體與列舉AndroidC語言
- C語言實現通訊錄管理系統(結構體、列舉、聯合體應用)C語言結構體
- 乾貨分享:淺談記憶體洩露記憶體洩露
- C語言 共用體C語言
- C語言結構聯合位欄位知識體系總結大學霸IT達人C語言
- MySql乾貨分享之索引MySql索引
- 乾貨好文帶你理解C語言中的連結串列C語言
- 最‘乾淨’的程式語言——空白程式語言
- shell 語法 乾貨
- 西文字型相關術語解說及《乾貨分享》
- 乾貨分享|快速定位UXDB中CPU高負荷的SQL語句UXSQL
- c++結構體、共用體(聯合體)C++結構體
- C語言的記憶體分配C語言記憶體
- C語言完美體系C語言
- C語言(結構體)C語言結構體
- 乾貨分享 | PCB測試點的用途
- 乾貨分享:PPT製作技巧
- 【乾貨】BAT面試經驗分享BAT面試
- 分享一份C語言寫的簡歷C語言
- 乾貨分享丨3種SQL語句最佳化方法,軟體測試必備!SQL
- [乾貨分享]1000篇乾貨好文!量子技術——資訊篇
- GitHub專案:自然語言處理專案的相關乾貨整理Github自然語言處理
- 【乾貨分享】軟體Bug和缺陷有什麼區別?
- 乾貨分享:Air780E軟體指南:字串處理AI字串
- C語言-記憶體分配C語言記憶體
- C語言(共用體型別)C語言型別
- C語言:記憶體使用C語言記憶體
- 乾貨分享|Bitset 應用詳解
- 分享下自己學習C語言的方法和心得!C語言