【C語言模擬實現】浮點數-轉-定點數


要想超神,就要什么都精!

知識准備:

1. 輸出浮點數的十六進制形式?(利用指針輸出)

將浮點數指針-轉換成-整型指針,以十六進制的格式輸出指針內容。

示例程序:

#include<stdio.h>

int main()
{
        float *var;

        scanf("%f",var);
        printf("%x",*((int*)var));
}

測試

輸入(float) 輸出(十六進制) 二進制
8.25 41040000 0100 0001 0000 0100 0000 0000 0000 0000
-8.25 c1040000 1100 0001 0000 0100 0000 0000 0000 0000

 

 

 

 

 

浮點數在計算機的存儲格式?

符號位:0為正,1為負;

指數位:移碼表示;

尾數位:隱式存儲小數點前面的1,也就是只存儲小數點后面的位

示例:

十進制:8.25

二進制:1000.01 = 1.00001 x 23 = 1.00001 x 2011

符號位為:0

指數位為:3 + 127 = 130 = 1000 0010b

尾數位為:00001

最終,8.25在計算機中存儲的形式為0100 0001 0000 0100 0000 0000 0000 0000b

對比我們自己計算出的結果 與 通過計算機輸出的結果,一致:程序正確。

可以正式進行程序設計了

程序設計:

我們int型作為定點數的一個容器,假設定點數32位,符號部分1位,整數部分15位,小數部分16位

 分別得到浮點數的符號、整數部分與小數部分,對應到定點數的各部分。

程序:

#include<stdio.h>

#define SIGN_BIT 0x80000000
#define EXP_BIT  0x7f800000
#define TAIL_BIT 0x007fffff

int main()
{
        float *aFloat;//浮點數
        int aFix = 0;//定點數容器
        int tmp = 0;//浮點數容器
        int exp = 0;//指數大小
        int tail = 0;//尾數位容器
        scanf("%f",aFloat);
        tmp = *((int*)aFloat);//置定點數的符號位 
        aFix = tmp & SIGN_BIT;

        //置定點數的整數部分
        exp = ((tmp & EXP_BIT) >> 23) - 127;//指數值
        tail = ((tmp & TAIL_BIT) | 0x00800000);//尾數各位 
        aFix = aFix | ((tail >> (23-exp)) << 16);

        //置定點數的小數部分
        aFix = aFix | ((tail & ~(0xffffffff << (23-exp))) >> (7-exp));
        printf("%x\n",aFix);
}

 

測試:

輸入 輸出(十六進制) 輸出(二進制)
8.25 84000 0000 0000 0000 1000 0100 0000 0000 0000 0000
-8.25 80084000 1000 0000 0000 1000 0100 0000 0000 0000 0000

 

 

 

 按照我們前面指定的規則:定點數的符號位1位,整數位15位,小數位16位

將二進制換算出來,答案正確。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM