要想超神,就要什么都精!
知识准备:
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 = ;//定点数容器
int tmp = ;//浮点数容器
int exp = ;//指数大小
int tail = ;//尾数位容器
scanf("%f",aFloat);
tmp = *((int*)aFloat);//置定点数的符号位
aFix = tmp & SIGN_BIT; //置定点数的整数部分
exp = ((tmp & EXP_BIT) >> ) - ;//指数值
tail = ((tmp & TAIL_BIT) | 0x00800000);//尾数各位
aFix = aFix | ((tail >> (-exp)) << ); //置定点数的小数部分
aFix = aFix | ((tail & ~(0xffffffff << (-exp))) >> (-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位
将二进制换算出来,答案正确。