精品国产人成在线_亚洲高清无码在线观看_国产在线视频国产永久2021_国产AV综合第一页一个的一区免费影院黑人_最近中文字幕MV高清在线视频

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

如何使用union處理浮點數據?

jf_L18yujSQ ? 來源:小飛哥玩嵌入式 ? 2023-05-15 09:47 ? 次閱讀

聯合體(union)的使用和分析

1、聯合體

聯合體(union)與結構體(struct)有一些相似之處。但兩者有本質上的不同。在結構體中,各成員有各自的內存空間, 一個結構變量的總長度是各成員長度之和。而在聯合體中,各成員共享一段內存空間, 一個聯合變量的長度等于各成員中最長的長度。應該說明的是, 這里所謂的共享不是指把多個成員同時裝入一個聯合變量內, 而是指該聯合變量可被賦予任一成員值,但每次只能賦一種值, 賦入新值則沖去舊值。

2、聲明共用體類型

一個聯合體類型必須經過定義之后, 才能使用它,才能把一個變量聲明定義為該聯合體類型。

聯合變量的聲明和結構變量的聲明方式相同, 也有三種形式。

一般形式具體如下:

union共用體名
{
//成員列表
數據類型成員名;
數據類型成員名;
....
}

示例:

union_MQ
{
chardata8[4];
intdata32;
};

3、定義共用體變量

一般形式具體如下:

union_MQ
{
chardata8[4];
intdata32;
};
//定義共用體變量
union_MQmq;

合并簡化形式具體如下:

union_MQ
{
chardata8[4];
intdata32;
}mq;

匿名結構體形式具體如下:

union
{
chardata8[4];
intdata32;
}mq;

使用 typedef 聲明共用體類型,再定義共用體變量:

typedefunionMQ
{
chardata8[4];
intdata32;
}_MQ;
//定義共用體變量,以下兩種效果一樣
unionMQmq;
_MQmq;

4、上代碼:

#include

unionTest{
unsignedchara;
unsignedshortb;
unsignedintc;
};

intmain(void)
{
unionTesttest;
printf("%lu
",sizeof(unionTest));
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);
return0;
}

結果:

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

結果分析:

1、聯合體的大小為最大成員的大小,在聯合體union Test中unsigned int是最大的占4個字節。

2、聯合體共用一塊內存,其內存大小為最大成員的內存大小,所以所以成員的地址都一樣,&test = &test.a = &test.b = &test.c。

3、給聯合體某個成員賦值時會影響到另外一個成員的數值,如下圖:

d0a24406-f29c-11ed-90ce-dac502259ad0.png

如果是小端模式:

變量高位是放高地址、變量低位是放低地址。這里test.c=0x11223344指11為高位、44為低位。

棧區遵循“先進后出、后進先出”的規則,即打印的時候從高地址到地址依次打印,所以test.c打印值為11223344。

從上圖可以看出,test.a、test.b和test.c的起使地址都是44對應的地址,所以他們的地址都是一樣的。

如果test.a = 0x88,那么test.a、test.b和test.c本來的值都會發生改變,即test.a = 88,test.b = 3388,test.c = 11223388。

利用聯合體處理浮點型數據

經過上面對聯合體的簡單介紹,想必不少同學已經知道小飛哥接下來要說什么了吧

直接上測試代碼:d0ba6540-f29c-11ed-90ce-dac502259ad0.png

測試結果是什么呢?

d107397e-f29c-11ed-90ce-dac502259ad0.png

輸入的浮點數是6.91,我們可以看到uint8_data也有了4個值,從聯合體的定義來看,這兩個值應該是一樣的,我們來驗證下是不是如此:

浮點轉16進制還是挺麻煩的,有精力的同學可以自己算算,沒精力的同學可以使用這個鏈接的在線轉換工具

http://xnkiot.com/#/floating

轉換之后的結果跟我們上面代碼運行的結果是一致的d1496f06-f29c-11ed-90ce-dac502259ad0.png

那這個轉換有什么意義呢?我們經常通訊串數過程中,比如串口傳輸的事單字節數據,對于float類型的數據就不能直接傳輸了,需要進行轉化,使用聯合體就可以很方便的進行“自動轉換”了

審核編輯:湯梓紅

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 數據
    +關注

    關注

    8

    文章

    6891

    瀏覽量

    88827
  • 內存
    +關注

    關注

    8

    文章

    2999

    瀏覽量

    73883
  • 變量
    +關注

    關注

    0

    文章

    613

    瀏覽量

    28329
  • 結構體
    +關注

    關注

    1

    文章

    129

    瀏覽量

    10833
  • union
    +關注

    關注

    0

    文章

    10

    瀏覽量

    4253

原文標題:如何使用union處理浮點數據?

文章出處:【微信號:小飛哥玩嵌入式,微信公眾號:小飛哥玩嵌入式】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    labview和單片機通訊浮點數如何處理

    通過labview和下位機單片機通過串口通訊,對于浮點數,如果上位機要把浮點數傳給下位機 或者下位機(單片機)要把浮點數傳給上位機(labview)浮點數需要如何
    發表于 06-06 21:05

    單片機浮點數轉十六進制,串口接收浮點數處理

    經驗 浮點轉十六進制:/*作用:浮點數---轉---十六進制 */ union fnum{long int m;float f; };然后需要在引用的函數內聲明共用體比如:union
    發表于 07-18 14:57

    數據轉換:十六進制與浮點數的互相轉換

    數據轉換:十六進制與浮點數的互相轉換在DSP上做數據處理遇到,浮點型存儲格式,轉換成十進制的浮點型參與運算。最終通過用
    發表于 10-25 14:57

    點數浮點數的區別是什么

    點數浮點數的區別目的:理解定點數浮點數在傅里葉變換(FFT)的實際應用中的選擇單片機中如果需要進行一定的運算(常見的傅里葉變換)時,需要在不同情況下對AD采集的
    發表于 02-21 07:22

    浮點數在單片機數據采集監控系統中的應用

    單片機能夠直接處理的數是定點數,然而實際上需要輸入、處理和顯示的數據卻是浮點數,本文詳細介紹了浮點數
    發表于 08-13 15:38 ?44次下載

    浮點數的表示方法

    浮點數的表示方法  浮點數,是指小數點在數據中的位置可以左右移動的數據。它通常被表示成:    N = M* RE  這里的M(Mantissa)被稱為
    發表于 10-13 17:13 ?1.6w次閱讀
    <b class='flag-5'>浮點數</b>的表示方法

    浮點數常用的編碼方法

    浮點數常用的編碼方法  前面已經說到,在計算機內,浮點數被表示為如下格式:    通常情況
    發表于 10-13 17:21 ?4450次閱讀
    <b class='flag-5'>浮點數</b>常用的編碼方法

    32位浮點數字信號處理器SHARC產品組合(ADI)

    32位浮點數字信號處理器SHARC產品組合(ADI) Analog Devices, Inc.,全球領先的高性能信號處理解決方案供應商,最新推出32位浮點數
    發表于 04-10 09:59 ?1306次閱讀

    modbus 如何讀取浮點數

    本文為大家介紹modbus讀取浮點數的兩個程序設計。
    發表于 02-08 10:03 ?1.4w次閱讀

    FLASH存儲浮點數據的解決辦法

    需求: 參數的數據類型為浮點數據,需要存儲至FLASH中。解決辦法:采用聯合體聯合體特性:聯合體內的參數,共用一塊內存。案例://構建聯合體數據結構typedef union{ f
    發表于 12-02 12:21 ?6次下載
    FLASH存儲<b class='flag-5'>浮點數據</b>的解決辦法

    如何在FPGA中正確處理浮點數運算

    使用插值算法實現圖像縮放是數字圖像處理算法中經常遇到的問題。我們經常會將某種尺寸的圖像轉換為其他尺寸的圖像,如放大或者縮小圖像。由于在縮放的過程中會遇到浮點數,如何在FPGA中正確的處理浮點數
    的頭像 發表于 03-18 11:03 ?4993次閱讀

    談一談浮點數的精度問題

    還是要從浮點數的存儲和標識出發來處理該問題,既然浮點數天然就存在一定的誤差,而有時候計算又無法獲得唯一的數值,如下圖所示,浮點數計算出來的實軸上的值都會因為
    的頭像 發表于 08-11 14:28 ?4470次閱讀
    談一談<b class='flag-5'>浮點數</b>的精度問題

    什么是浮點數浮點數在內存中的存儲

    浮點型簡單講就是實數的意思。浮點數在計算機中用以近似表示任意某個實數。
    的頭像 發表于 11-09 11:07 ?5196次閱讀
    什么是<b class='flag-5'>浮點數</b>?<b class='flag-5'>浮點數</b>在內存中的存儲

    什么是浮點數

    Python數據類型第一種:字符串(str)。 Python數據類型第二種:整數(int)。 Python數據類型第三種:浮點數浮點數
    的頭像 發表于 02-23 14:58 ?4502次閱讀

    modbus浮點數怎么讀取

    Modbus是一種通信協議,常用于工業自動化系統中的設備之間的通信。它支持多種數據類型,包括整數、浮點數、字符串等。浮點數在工業領域中廣泛應用,因此了解如何讀取和處理Modbus
    的頭像 發表于 12-28 14:38 ?5855次閱讀