【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进制格式输出该整数。
运行结果:
与之前计算的结果相同,证明程序正确。
相关文章推荐
- C语言学习3-1:成绩检测,使用while和do...while得到九九乘法,1-1/2+1/3-1/4 .......+1/10求和,输入10进制打印2进制,求素数,猜随机产生的数字,16进制转二进制,
- c语言:输入两个整数m和n,计算需要改变m的二进制表示中的多少位才能得到n
- c语言:输入两个整数m和n,计算需要改变m的二进制表示中的多少位才能得到n
- leetcode 338. Counting Bits(C语言,二进制中1的个数)39
- 二进制浮点数算术标准 IEEE 754
- 位域-得到任何类型二进制显示
- C语言 定义一个宏,用于交换一个二进制序列的奇数位和偶数位
- C语言解析pcap文件得到HTTP信息实例
- Linux下C语言开发(已知进程名得到其PID号)
- c语言:统计整数二进制表示中1的个数(汉明重量)
- C语言二进制文件和文本文件的区别
- 浮点数的二进制表示学习
- 浮点数的二进制表示
- C语言实现加减乘除(可以带括号,浮点数)计算器
- 2.8 编写一个函数rightrot(x, n),该函数返回将x循环右移(即从最右端移出的位将从最左端再移入)n(二进制)位后所得到的值。
- C语言以二进制形式读入文件
- C语言 如何得到文件的大小
- 基于二进制的集合(c语言)
- C语言读写文件两种方式ASCII 和 二进制。