首页 > 代码库 > 【C语言模拟实现】浮点数-转-定点数

【C语言模拟实现】浮点数-转-定点数

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

知识准备:

1. 输出浮点数的十六进制形式?(利用指针输出)

将浮点数指针-转换成-整型指针,以十六进制的格式输出指针内容。

示例程序:

#include<stdio.h>int main(){        float *var;        scanf("%f",var);        printf("%x",*((int*)var));}

测试

输入(float)输出(十六进制)二进制
8.25410400000100 0001 0000 0100 0000 0000 0000 0000
-8.25c10400001100 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 0x007fffffint 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.25840000000 0000 0000 1000 0100 0000 0000 0000 0000
-8.25800840001000 0000 0000 1000 0100 0000 0000 0000 0000

 

 

 

 按照我们前面指定的规则:定点数的符号位1位,整数位15位,小数位16位

将二进制换算出来,答案正确。

 

【C语言模拟实现】浮点数-转-定点数