C语言:浮点数在内存中的表示
来源:互联网 发布:知乎 wordpress 编辑:程序博客网 时间:2024/04/29 17:50
单精度浮点数: 1位符号位 8位阶码位 23位尾数
双精度浮点数: 1位符号位 8位阶码位 52位尾数
实数在内存中以规范化的浮点数存放,包括数符、阶码、尾数。数的精度取决于尾数的位数。比如32位机上float型为23位 double型为52位。
单精度float型存储在内存中的大小为4个字节,即32位。
浮点表示的一般形式为:R=M*2^e (R:Real M:Mantissa尾数 e:exponent阶码)
把上面float的二进制可分成三部分:
x xxxxxxxx xxxxxxxxxxxxxxxxxxxxxxx
数符(1b) 阶码(8b) 尾数(23b)
double型的浮点数分别是:数符(1b)、阶码(8b)、尾数(52b)
数符sign:real的正负号 "+":0 "-":1
阶码e:e=E-127(double型中e=E-1023) e为正值说明这个浮点数向左移动了e位, e为负值说明这个浮点数向右移动了e位。127=2^7-1 1023=2^10-1
尾数M:有效数字位,这里是有效数字位的部分二进制码
例1:float型浮点数125.5转化成32位二进制浮点数
125.5的二进制码为1111101.1,写成二进制的科学计数为:1.111101*2^6(因为科学计数法“整数”部分大于1,在二进制中,“整数”部分只能恒为1)即向左移6位,则e=6,则E=e+127=133,而E的二进制码为10000101,而1.111101把“整数”部分去除1之后为111101,之后补0,共23b,形成了阶码。
所以125.5的32位二进制浮点数为
0 10000101 11110100000000000000000
例2:float型浮点数0.5转化成32位二进制浮点数
0.5的二进制码为0.1,写成二进制的科学计数为:1.0*2^(-1)即向右移1位,则e=-1,则E=e+127=126,而E的二进制码为01111110,而1.0把“整数”部分去除1之后为0,之后补0,形成了阶码。
所以0.5的32位二进制浮点数为
0 01111110 00000000000000000000000
double型浮点数类似。
例3:32位二进制浮点数为0 10000010 00010000000000000000000转化成十进制数浮点数
题中已给我们分了三部分,数符部分、阶码部分、尾数部分。
数符部分为0,则代表此数为正数;阶码部分为10000010,则E=130,则e=E-127=3,则说明其向左移了3位,0001加上“整数”部分的1之后,为1.0001。则原二进制数为1000.1=十进制8.5,或R=1.0001*2^3=8.5
其中很多计算类似。可举一反三!
版权声明:本文为博主原创文章,未经博主允许不得转载。
- C语言:浮点数在内存中的表示
- C语言:浮点数在内存中的表示(转)
- C语言:浮点数在内存中的表示
- C语言:浮点数在内存中的表示
- [C/C++]浮点数在内存中的表示
- 浮点数在内存中的表示 实例
- 浮点数在内存中的表示方式
- 浮点数在内存中的表示
- 浮点数在内存中的表示
- 浮点数在内存中的表示
- 浮点数在内存中的表示
- 浮点数在内存中的表示
- 浮点数在内存中的表示
- 浮点数在内存中的存储表示
- 浮点数在内存中的表示
- 浮点数在内存中的表示
- 浮点数在内存中的表示
- 浮点数在内存中的表示
- PHP识别二维码(php-zbarcode)
- 瀑布流
- adb shell下提示read-only file system
- 使用CAS登录模块连接数据库验证用户合法性
- libevent代码阅读(10)——“hello-world.c”之 把事件处理器添加到event_base对象的注册的事件处理器的队列
- C语言:浮点数在内存中的表示
- 静态方法和继承的关系
- worklight获取设备的deviceID
- 判断一个坐标点是否在一个无规则的多边形内 (iOS定位服务与地图应用开发:高德地图开发)
- Android NDK 1 - 指令集、CPU架构与汇编
- Find the maximum subarray XOR in a given array
- iOS开发之获取设备型号(最新)
- Objective-C——retain/copy/assign/atomic/nonatomic/strong/weak/readonly/readwrite详解
- Android PopWindow的简单应用