输⼊(float)输出(⼗六
进制)
⼆进制
8.25410400000100 0001 0000 0100 0000 0000 0000 0000
-8.25c10400001100 0001 0000 0100 0000
0000 0000 0000
【C语⾔模拟实现】浮点数-转-定点数
要想超神,就要什么都精!
知识准备:
1. 输出浮点数的⼗六进制形式?(利⽤指针输出)
将浮点数指针-转换成-整型指针,以⼗六进制的格式输出指针内容。
⽰例程序:
#include<stdio.h>
int main()
{
float *var;中秋节日
scanf("%f",var);
printf("%x",*((int*)var));
}
测试:
浮点数在计算机的存储格式?
符号位: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.25840000000 0000 0000 1000 0100 0000 0000 0000 0000 -8.25800840001000 0000 0000 1000 0100 0000 0000 0000 0000
按照我们前⾯指定的规则:定点数的符号位1位,整数位15位,⼩数位16位将⼆进制换算出来,答案正确。