要想超神,就要什么都精!
知識准備:
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位
將二進制換算出來,答案正確。