您的位置:首页 > 编程语言 > C语言/C++

【C语言】得到浮点数的二进制

2017-02-25 19:59 134 查看

浮点数在内存中的存储

本文主要介绍通过C语言来获得浮点数在内存中的实际存储方式。


浮点数在内存中是按照IEEE754标准进行存储的,本文以单精度浮点型为例,也就是C语言中的float型,双精度存储原理与单精度的类似,只是位数长度不同。

IEEE754 单精度浮点型格式

float 型有32位,其中最高一位是符号位S,S=0 表示正数,S=1 表示负数。

最高位后面的8位是阶码E,剩下的23位为尾数部分M。

阶码E=指数真值e+127,这样使得阶码不为负数,方便了指数大小比较和运算时的对阶。

安装浮点数规格化的表示,尾数部分的最高有效位应该为1,也就是说,尾数部分M代表的真值为1.M。

S(符号位)E(阶码)M(尾数)
1位8位23位

按照IEEE754标准 0.75 的表示格式

(+0.75)10 = (+0.11)2

先规格化:+0.11 = +1.1 x 2-1

S = 0 , e = -1 , M = 1 , E = e + 127 = 126 = (0111 1110)2

所以在内存中 0.75 应该是

(0 0 1 1 1 1 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0)2 = (3F400000)16

↑ ↑[b]______________[/b]↑ ↑[b]_____________________________________________[/b]↑

S E M

通过C语言来得到浮点数在内存的表示

代码:

#include <stdio.h>
int main() {
float a ;
scanf("%f", &a);            //从键盘获取一个浮点数
printf("%f\n", a);          //显示这个浮点数
printf("%x\n", *(int *)&a); //以十六进制的格式显示该浮点数
return 0;
}


主要代码的解释:

(int *)&a
是将float型变量a的地址强制转换为int型变量的地址,使系统认为接下来的32 bit 存的是一个int型的整数,

(*(int *)&a)
就是将这个整数取出来,
%x
表示以16进制格式输出该整数。

运行结果:



与之前计算的结果相同,证明程序正确。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息