首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

C 語言實現十進制轉 IEEE 754 單精度浮點數位模式輸出

     編輯:程式設計綜合問答

需求

輸入十進制小數,按 **1 位符號位 + 8 位指數位 + 23 位尾數位** 輸出二進制位模式。

IEEE 754 單精度結構

| 符號位 (1bit) | 指數位 (8bits) | 尾數位 (23bits) |
|      S        |      E         |        M        |
值 = (-1)^S × 1.M × 2^(E-127)

核心思路:聯合體/指針強制類型轉換

利用 float 在內存中**就是** IEEE 754 格式,直接讀取其 32 位整數表示,再按位拆解。

完整代碼

#include <stdio.h>
#include <stdint.h>

void printFloatBits(float f) {
    // 1. 取 float 的 32 位原始位模式
    uint32_t bits;
    // 方法 A:聯合體(標準、無未定義行為)
    union { float f; uint32_t u; } converter;
    converter.f = f;
    bits = converter.u;

    // 方法 B:指針轉換(常見但嚴格屬於 UB,主流編譯器支持)
    // uint32_t bits = *(uint32_t*)&f;

    // 2. 拆解位段
    uint32_t sign     = (bits >> 31) & 0x1;
    uint32_t exponent = (bits >> 23) & 0xFF;
    uint32_t mantissa = bits & 0x7FFFFF;

    // 3. 輸出
    printf("原始十六進制: 0x%08X\n", bits);
    printf("二進制位模式: ");
    for (int i = 31; i >= 0; i--) {
        putchar((bits >> i) & 1 ? '1' : '0');
        if (i == 31 || i == 23) putchar(' '); // 分隔符號位/指數位/尾數位
    }
    printf("\n");
    printf("符號位 S = %u\n", sign);
    printf("指數位 E = %u (0x%02X, 偏移後真實指數 = %d)\n", exponent, exponent, (int)exponent - 127);
    printf("尾數位 M = %u (0x%06X, 隱含最高位 1 → 1.%06X)\n", mantissa, mantissa, mantissa);
}

int main() {
    float input;
    printf("請輸入十進制小數: ");
    if (scanf("%f", &input) != 1) return 1;
    printFloatBits(input);
    return 0;
}

運行示例

輸入: 1.0
輸出:
原始十六進制: 0x3F800000
二進制位模式: 0 01111111 00000000000000000000000
符號位 S = 0
指數位 E = 127 (0x7F, 偏移後真實指數 = 0)
尾數位 M = 0 (0x000000, 隱含最高位 1 → 1.000000)

輸入: -12.5
輸出:
原始十六進制: 0xC1480000
二進制位模式: 1 10000010 10010000000000000000000
符號位 S = 1
指數位 E = 130 (0x82, 偏移後真實指數 = 3)
尾數位 M = 4718592 (0x480000, 隱含最高位 1 → 1.1001)

特殊值處理

值指數位 E尾數位 M含義
±000零
非規約數0≠0隱含最高位 0,精度較低
±∞2550無窮大
NaN255≠0非數字

進階:不依賴 float 直接解析字符串

若要求**不使用 float 變量**,需手寫十進制字符串 → 二進制科學計數法 → 構造 IEEE 754 位模式,屬於大數/高精度轉換範疇,可參考 strtod 開源實現(如 musl、glibc)。

利用 C 語言**類型懲罰** 直接讀取 float 內存位模式,是教學與工程中最簡潔高效的做法。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved