C語言再學習 -- 單精度(float)和雙精度(double)浮點數 與 十六進制(HEX) 之間轉換(轉載))

之前講過浮點數部分,參看:C語言再學習 – 浮點數

現在程序中要將浮點數,通過TCP發送。那得先將其轉換為十六進制才行呀。
那么問題就來了。

參看:C語言:單精度(float)和雙精度(double)浮點數 與 十六進制(HEX) 之間轉換

擴展:
STM32開發 – 進制與字符串間的轉換

一、浮點數 介紹

  • 單精度浮點float:可以精確到小數點后6位
  • 雙精度浮點double:可以精確到小數點后12位

C可以通過f或F后綴是編譯器把浮點常量當做float類型,比如2.3f和9.11E9F。
l或L后綴使一個數字成為long double類型,比如54.3l和4.32e4L。
建議使用L后綴,因為字母l和數字1容易混淆
沒有后綴的浮點常量為double類型。(重點)。例:sizeof(1.9) = 8;

浮點數二進制表達的三個組成部分

Sign(1bit):表示浮點數是正數還是負數。 0表示正數,1表示負數
Exponent(8bits):指數部分。 類似于科學技術法中的M*10^N中的N,只不過這里是以2為底數而不是10。需要注意的是,這部分中是以2 ^ 7-1即127,也即01111111代表2 ^ 0,轉換時需要根據127作偏移調整。
Mantissa(23bits):基數部分。 浮點數具體數值的實際表示。

單精度(float)浮點數----32位

具體結構如下表所示:
在這里插入圖片描述

雙精度(double)浮點數----64位

在這里插入圖片描述

二、浮點數十六進制轉換器

鏈接:浮點數十六進制轉換器v1.1
提取碼:775u
在這里插入圖片描述

浮點數 13.88 單精度(float) 轉 十六進制(HEX)為 41 5E 14 7B 雙精度(double)轉 十六進制(HEX)為
40 2B C2 8F 5C 28 F5 C3

三、C語言實現 浮點數 轉 十六進制(HEX)

1、單精度(float) 轉 十六進制(HEX)

(1)指針法

具體代碼如下:

void Float_HEX (float fdata, unsigned char *hdata)
{unsigned char* tdata = (unsigned char*)(&fdata);hdata[0] = tdata[0];hdata[1] = tdata[1];hdata[2] = tdata[2];hdata[3] = tdata[3];
}

測試用例如下:

int main(int argc, char *argv[])
{unsigned char data[4] = {0,0,0,0};float fdata = 13.88;Float_HEX(fdata,data);for(int i=0;i<4;i++)printf("0x%X\n",data[i]);return 0;
}

由于我的電腦系統是小端模式,所以低字節在前。
運行結果如下:
在這里插入圖片描述

(2)共用體法

具體代碼如下:

union {float 	fdata;unsigned char 	data[4];
}temp;

測試用例如下:

int main(int argc, char *argv[])
{temp.fdata = 13.88;for(int i=0;i<4;i++)printf("0x%X\n",temp.data[i]);return 0;
}

由于我的電腦系統是小端模式,所以低字節在前。
運行結果如下:
在這里插入圖片描述

(3)memcpy()函數法

具體代碼如下:

void Float_HEX (float fdata, unsigned char *hdata)
{memcpy(hdata,&fdata,sizeof(fdata));
}

測試用例如下:

int main(int argc, char *argv[])
{unsigned char data[4] = {0,0,0,0};float fdata = 13.88;Float_HEX(fdata,data);for(int i=0;i<4;i++)printf("0x%X\n",data[i]);return 0;
}

由于我的電腦系統是小端模式,所以低字節在前。
運行結果如下:
在這里插入圖片描述

2、雙精度(double)轉 十六進制(HEX)

(1)指針法

具體代碼如下:

void Double_HEX (double Ddata, unsigned char *hdata)
{unsigned char* tdata = (unsigned char*)(&Ddata);hdata[0] = tdata[0];hdata[1] = tdata[1];hdata[2] = tdata[2];hdata[3] = tdata[3];hdata[4] = tdata[4];hdata[5] = tdata[5];hdata[6] = tdata[6];hdata[7] = tdata[7];
}

測試用例如下:

int main(int argc, char *argv[])
{unsigned char data[8] = {0,0,0,0,0,0,0,0};double Ddata = 13.88;Double_HEX(Ddata,data);for(int i=0;i<8;i++)printf("0x%X\n",data[i]);return 0;
}

由于我的電腦系統是小端模式,所以低字節在前。
運行結果如下:
在這里插入圖片描述

(2)共用體法

具體代碼如下:

union {double 	 Ddata;unsigned char 	data[8];
}temp;

測試用例如下:

int main(int argc, char *argv[])
{temp.Ddata = 13.88; for(int i=0;i<8;i++)printf("0x%X\n",temp.data[i]);return 0;
}

由于我的電腦系統是小端模式,所以低字節在前。
運行結果如下:
在這里插入圖片描述

(3)memcpy()函數法

具體代碼如下:

void Double_HEX (double Ddata, unsigned char *hdata)
{memcpy(hdata,&Ddata,sizeof(Ddata));
}
int main(int argc, char *argv[])
{unsigned char data[8] = {0,0,0,0,0,0,0,0};double Ddata = 13.88;Double_HEX(Ddata,data);for(int i=0;i<8;i++)printf("0x%X\n",data[i]);return 0;
}

由于我的電腦系統是小端模式,所以低字節在前。
運行結果如下:
在這里插入圖片描述

四、十六進制(HEX) 轉 浮點數

1、十六進制(HEX) 轉 單精度(float)

具體代碼如下:

int main(int argc, char *argv[])
{char data[4] = {0x7B,0x14,0x5E,0x41};float fdata = 0;memcpy(&fdata,data,sizeof(fdata));printf("fdata=%f\n",fdata);return 0;
}

運行結果如下:
在這里插入圖片描述

2、十六進制(HEX) 轉 雙精度(double)

具體代碼如下:

int main(int argc, char* argv[])
{char data[8] = { 0xC3,0xF5,0x28,0x5C,0x8F,0xC2,0x2B,0x40 };double Ddata = 0;memcpy(&Ddata, data, sizeof(Ddata));printf("Ddata=%f\n", Ddata);return 0;
}

運行結果如下:
在這里插入圖片描述

五、浮點二進制轉換工具

參看:浮點二進制轉換工具
在這里插入圖片描述

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/212014.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/212014.shtml
英文地址,請注明出處:http://en.pswp.cn/news/212014.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

(JAVA)-打印流

打印流是高級流&#xff0c;只能寫不能讀&#xff0c;只有輸出流 只操作文件目的地&#xff0c;不操作數據源 能實現數據的原樣輸出 printStream:字節打印流 構造方法&#xff1a; 用文件或地址的方式創建字節打印流也會創建一個字節基本流。 字節流底層沒有緩存區&#xff…

文檔或書籍掃描為 PDF:ScanPapyrus Crack

ScanPapyrus 可讓您快速輕松地將文檔或書籍掃描為 PDF&#xff0c;批處理模式使掃描過程快速高效&#xff0c;自動處理書籍并將其拆分為單獨的頁面 用于快速掃描文檔、書籍或打印照片的掃描儀軟件 快速掃描文檔 使用此掃描儀軟件&#xff0c;您無需在掃描儀和計算機之間來回移動…

SpringBoot 官方腳手架不再支持Java8和Java11

Spring 官方腳手架不再支持初始化 Java8 和 Java 11 項目&#xff0c;目前僅支持初始化Java17 和 Java21 項目。 阿里巴巴Spring腳手架支持初始化Java8、Java11、Java17、Java19 的項目&#xff0c;不支持初始化Java21的項目。

Torn Lucky Ticket

題目 #include<bits/stdc.h> using namespace std; #define int long long const int maxn 1e6 5, d 500; vector<string> vec[6]; int mp[1005]; signed main(){int n;cin >> n;for(int i 1; i < n; i){string s;cin >> s;int len s.size();…

java簡述springboot內置數據庫 并舉例啟動h2內存數據環境

在前面 我們講了 springboot 給我們提供了 默認的 數據源 默認 HikariCP 以及其他兩種內置數據源 持久化技術 JdbcTemplate 那么 說起來很多人難以置信 不過 springboot 也真的給我們內置了數據庫技術 而且不止一種 是三種 這三個數據庫的特點在于 它們都是用java語言寫的 就表…

28 動態規劃解按摩師的最長預約時間

問題描述&#xff1a;一名有名的按摩師會受到源源不斷的預約請求&#xff0c;每個預約都可以選擇接或者不接&#xff0c;在每次預約服務之間要有休息時間&#xff0c;因此不能接相鄰的預約&#xff0c;給定一個請求序列&#xff0c;按摩師找到最優的預約集合(總預約時間最長)&a…

探索中文文本處理利器 - Python jieba庫詳解

更多資料獲取 &#x1f4da; 個人網站&#xff1a;ipengtao.com jieba庫介紹 在處理中文文本數據時&#xff0c;分詞是一項至關重要的任務。而在Python的工具箱中&#xff0c;jieba庫作為一款強大的中文分詞工具&#xff0c;為開發者提供了高效而靈活的解決方案。jieba&#…

JDK8新特性:Lambda表達式規則及用法,方法引用

目錄 Lambda表達式是JDK8新增的一種語法格式 1.作用 2.用法規則&#xff1a; 3.方法引用 Lambda表達式是JDK8新增的一種語法格式 1.作用 簡化匿名內部類的代碼寫法 Lambad用法前提&#xff1a;只能簡化函數式接口&#xff08;一般加有Funcationallnterface&#xff09;&a…

Python dateutil 庫:簡化日期和時間處理的利器

更多資料獲取 &#x1f4da; 個人網站&#xff1a;ipengtao.com 在Python中&#xff0c;處理日期和時間是常見的任務之一。dateutil庫是Python標準庫中datetime模塊的擴展&#xff0c;提供了許多方便的工具和函數&#xff0c;簡化了日期和時間的操作。 安裝與基本用法 首先&…

小黑子之——MybatiPlus整合

MybatiPlus學習 一、MybatiPlus簡介1.1 入門案例1.2 mybatisPlus概述1.3 總結 二、標準數據層開發2.1 標準的CRUD使用2.2 新增2.3 刪除2.4 修改2.5 根據Id查詢2.6 查詢全部2.7 Lombok2.8 分頁功能 三、DQL控制3.1 條件查詢方式3.1.1 構建條件查詢3.1.2 多條件查詢3.1.3 null值判…

運維05:自動化

人工運維時代 運維人員早期需要維護眾多的機器&#xff0c;因此需要執行很多重復的勞動&#xff0c;很多機器需要同時部署相同的服務或者是執行相同的命令&#xff0c;還得反復地登錄不同的機器&#xff0c;執行重復的動作 自動化運維時代 早期運維人員會結合ssh免密登錄&…

Java基礎——對象類型轉換(向上、向下轉型)

非繼承關系的類之間對象類型不可以互相類型轉換&#xff0c;只有繼承關系才可以互相轉換。 簡單說&#xff0c;對象類型轉換的前提要是繼承關系。 對象類型轉換分為&#xff1a;向上轉型和向下轉型。多態就是一種自動向上轉型。 向上轉型&#xff1a;子類對象用父類類型接收…

Leetcode 2963. Count the Number of Good Partitions

Leetcode 2963. Count the Number of Good Partitions 1. 解題思路2. 代碼實現 題目鏈接&#xff1a;2963. Count the Number of Good Partitions 1. 解題思路 這一題根據題意&#xff0c;顯然我們可以將其先分為 n n n個原子partition&#xff0c;確保任意兩個partition之間…

git 常用的使用方法

1.查看分支 $ git branch #查看本地分支 $ git branch -r #查看遠程分支 $ git branch -a #查看所有分支 $ git branch -vv #查看本地分支及追蹤的分支 2.創建分支 方法1 $ git branch 分支名 #創建本地分支 #將本地分支push&#xff0c;就創建了遠程分支方法2 #創建本地分…

載入了名字空間‘htmltools’ 0.5.6,但需要的是>= 0.5.7解決方案

解決方案&#xff1a;刪除之前的舊版本安裝包&#xff0c;安裝新的包 1.卸載之前的安裝包 2.關閉R&#xff0c;重新打開 3. # install.packages("htmltools") library(htmltools)

Java 并發編程(一)

1、在 java 中守護線程和本地線程區別&#xff1f; java 中的線程分為兩種&#xff1a;守護線程&#xff08;Daemon&#xff09;和用戶線程&#xff08;User&#xff09; 任何線程都可以設置為守護線程和用戶線程&#xff0c;通過方法 Thread.setDaemon(boolon)&#xff1b;tru…

HarmonyOS學習--了解基本工程目錄

1.工程級目錄 工程的目錄結構如下&#xff1a; 其中詳細如下&#xff1a; AppScope中存放應用全局所需要的資源文件。entry是應用的主模塊&#xff0c;存放HarmonyOS應用的代碼、資源等。oh_modules是工程的依賴包&#xff0c;存放工程依賴的源文件。build-profile.json5是工…

如何找到MACOS系統更新的安裝包

首先在應用商店中下載新系統的安裝包&#xff0c;然后在設置中不要點安裝&#xff0c;會自動跳出安裝的界面&#xff0c;不要關閉界面&#xff0c;打開命令行用root權限輸入命令cat /var/log/install.log | grep *.dmg&#xff0c; 就會顯示 sh-3.2# cat /var/log/install.log …

算法基礎十

加一 給定一個由 整數 組成的 非空 數組所表示的非負整數&#xff0c;在該數的基礎上加一。最高位數字存放在數組的首位&#xff0c; 數組中每個元素只存儲單個數字。 示例 1&#xff1a; 輸入&#xff1a;digits [1,2,3] 輸出&#xff1a;[1,2,4] 解釋&#xff1a;輸入數組表…

YOLO_embedded: YOLO算法快速嵌入式部署

YOLO_embedded&#xff1a; YOLO算法快速嵌入式部署 for UbuntuBased on YOLOXOpenVINO & TensorRT 本項目提供c和python兩種語言&#xff0c;詳情請見各個文件夾下的README.md 安裝OpenVINO 點此進入官網選擇版本進行下載&#xff0c;然后打開install_openvino.sh將相…