在嵌入式開發、網絡通信協議解析、數據存儲等場景中,經常需要將浮點數與其IEEE 754標準的二進制/十六進制表示相互轉換。本文提供一套完整的C語言實現,包含 float ↔ hex、二進制字符串 → float 等核心功能,並詳細解析IEEE 754單精度浮點數的位級結構。
32位單精度浮點數佈局:
數值計算公式:(-1)^sign × 1.mantissa × 2^(exponent-127)
#ifndef MMATH_H_ #define MMATH_H_ #include <stdio.h> #include <stdlib.h> #include <tgmath.h> #include <string.h> long FloatToHex(float val); // float → 十六進制整數 float HexToFloat(char* hexStr); // 8位十六進制字符串 → float float BinaryToInt(char* bin, int len); // 二進制字符串 → 整數 float BinaryToFraction(char* bin, int len); // 二進制小數字符串 → 小數 #endif
long FloatToHex(float val) {
return *(long*)&val; // 直接重新解釋內存位模式
}
利用指針類型轉換或聯合體,無需位運算即可獲取浮點數的原始位模式,效率極高。
float HexToFloat(char* ch) {
// 1. 十六進制字符串 → 32位二進制字符串
char binary[33] = {0};
for (int i = 0; i < 8; i++) {
// switch-case 將每個hex字符轉為4位二進制
// '0'→"0000", 'A'→"1010", 'F'→"1111" 等
}
// 2. 拆解IEEE 754三部分
char sign = binary[0];
char expBits[9] = {0};
char mantissaBits[24] = {0};
memcpy(expBits, binary + 1, 8);
memcpy(mantissaBits, binary + 9, 23);
// 3. 計算真實指數
float expVal = BinaryToInt(expBits, 8);
int shift = expVal - 127; // 去偏移
// 4. 根據指數正負分別處理整數部分與小數部分
// shift > 0: 小數點右移,形成整數部分
// shift = 0: 僅有隱含1
// shift < 0: 小數點左移,純小數
// 詳見源碼中的動態內存分配與字符串拼接邏輯
// 5. 組合結果並應用符號位
return (sign == '0') ? result : -result;
}
int main() {
float flh = -120.45f;
char hex[9] = {0};
// float → hex
sprintf(hex, "%lX", FloatToHex(flh));
printf("hex = %s\n", hex); // 輸出: C2F0E666
// hex → float
float f = HexToFloat(hex);
printf("f = %f\n", f); // 輸出: -120.450000
return 0;
}

malloc 後未 free,生產環境必須補全frexp/ldexp、memcpy配合 uint32_t 更安全// 現代C語言安全做法
#include <stdint.h>
#include <string.h>
uint32_t floatToBits(float f) {
uint32_t bits;
memcpy(&bits, &f, sizeof(bits));
return bits;
}
float bitsToFloat(uint32_t bits) {
float f;
memcpy(&f, &bits, sizeof(f));
return f;
}
本文代碼完整實現了浮點數與十六進制/二進制的雙向轉換,深度解析了IEEE 754標準的位級操作。雖然教學代碼在內存管理和邊界情況上有簡化,但核心邏輯清晰,極適合理解浮點數內部表示。實際項目中建議使用標準庫 memcpy 方式避免嚴格別名規則違規,並補全特殊值處理。