【转】计算机中浮点数的表示

来自:http://www.cnblogs.com/dolphin0520/archive/2011/10/02/2198280.html

  

C/C++浮点数在内存中的存储方式

任何数据在内存中都是以二进制的形式存储的,例如一个short型数据1156,其二进制表示形式为00000100 10000100。则在Intel CPU架构的系统中,存放方式为  10000100(低地址单元) 00000100(高地址单元),因为Intel CPU的架构是小端模式。但是对于浮点数在内存是如何存储的?目前所有的C/C++编译器都是采用IEEE所制定的标准浮点格式,即二进制科学表示法。

在二进制科学表示法中,S=M*2^N 主要由三部分构成:符号位+阶码(N)+尾数(M)。对于float型数据,其二进制有32位,其中符号位1位,阶码8位,尾数23位;对于double型数据,其二进制为64位,符号位1位,阶码11位,尾数52位。

31        30-23       22-0

float       符号位     阶码        尾数

63        62-52       51-0

double    符号位     阶码        尾数

符号位:0表示正,1表示负

阶码:这里阶码采用移码表示,对于float型数据其规定偏置量为127,阶码有正有负,对于8位二进制,则其表示范围为-128-127,double型规定为1023,其表示范围为-1024-1023。比如对于float型数据,若阶码的真实值为2,则加上127后为129,其阶码表示形式为10000010【这里是错误的,应为10000001,10000010是按课本上移码规则算的,但实际中并不用移码,而是用移码-1,即2的移码为10000010,移码的表示为补码符号位取反】

尾数:有效数字位,即部分二进制位(小数点后面的二进制位),因为规定M的整数部分恒为1,所以这个1就不进行存储了。

下面举例说明:

float型数据125.5转换为标准浮点格式

125二进制表示形式为1111101,小数部分表示为二进制为 1,则125.5二进制表示为1111101.1,由于规定尾数的整数部分恒为1,则表示为1.1111011*2^6,阶码为6,加上127为133,则表示为10000101,而对于尾数将整数部分1去掉,为1111011,在其后面补0使其位数达到23位,则为11110110000000000000000

则其二进制表示形式为

0 10000101 11110110000000000000000,则在内存中存放方式为:

00000000   低地址

00000000

11111011

01000010   高地址

而反过来若要根据二进制形式求算浮点数如0 10000101 11110110000000000000000

由于符号为为0,则为正数。阶码为133-127=6,尾数为11110110000000000000000,则其真实尾数为1.1111011。所以其大小为

1.1111011*2^6,将小数点右移6位,得到1111101.1,而1111101的十进制为125,0.1的十进制为1*2^(-1)=0.5,所以其大小为125.5。

同理若将float型数据0.5转换为二进制形式

0.5的二进制形式为0.1,由于规定正数部分必须为1,将小数点右移1位,则为1.0*2^(-1),其阶码为-1+127=126,表示为01111110,而尾数1.0去掉整数部分为0,补齐0到23位00000000000000000000000,则其二进制表示形式为

0 01111110 00000000000000000000000

由上分析可知float型数据最大表示范围为1.11111111111111111111111*2^127=3.4*10^38

对于double型数据情况类似,只不过其阶码为11位,偏置量为1023,尾数为52位。

测试程序:

/*测试浮点型数据在内存中存放方式  2011.10.2*/ 

#include <iostream>using namespace std;

int main(int argc, char *argv[]){    float a=125.5;    char *p=(char *)&a;    printf("%d\n",*p);    printf("%d\n",*(p+1));    printf("%d\n",*(p+2));    printf("%d\n",*(p+3));    return 0;}

输出结果为:

0

0

-5

66

在上面已经知道float型125.5在内存中存放方式为:

00000000   低地址

00000000

11111011

01000010   高地址

因此对于p和p+1指向的单元,其中存储的二进制数表示的十进制整数为0;

而对于p+2指向的单元,由于为char型指针,为带符号的数据类型,因此11111011,符号位为1,则为负数,由于在内存中二进制是以补码存储的,所以其真值为-5.

对于p+3指向的单元,01000010,为正数,则其大小为66。上面程序输出结果验证了其正确性。

posted on 2018-07-17 19:32 时空观察者9号 阅读(...) 评论(...) 编辑 收藏

【转】计算机中浮点数的表示相关推荐

  1. IEEE 754——计算机中浮点数的表示方法

    楔子 #include <iostream> int main(int, char**) {std::cout.precision(20);float a = 123.4567890123 ...

  2. 计算机中浮点数的表示及正负数小数的反码补码

    1. 计算机中浮点数的表示 计算机中浮点数用科学计数法来表示,分尾数.指数.阶码3部分. 阶符:指数的正负号.占1位,负为1正为0. 任意一个二进制数N,N=2P×S,其中S为尾数,P为阶码,阶码为固 ...

  3. 计算机中浮点数表示方法,浮点数的表示方法

    <浮点数的表示方法>由会员分享,可在线阅读,更多相关<浮点数的表示方法(2页珍藏版)>请在人人文库网上搜索. 1.浮点数的表示方法 一.浮点数表示 一个数的浮点形式(设基数是2 ...

  4. 计算机中浮点数的表示方法

    计算机中浮点数的表示方法 http://cenalulu.github.io/linux/about-denormalized-float-number/ 可以在这个网址验证自己的想法 https:/ ...

  5. 计算机中浮点数的表示,浮点数在计算机中的表示

    浮点数在计算机中的表示 最后编辑于:2010-4-13 计算机中数字是以0和1二进制保存的,我们熟悉的是整数的如何在计算机中表示,那么浮点数是如何表示的呢? 一.    转换 我们先来看看如何将十进制 ...

  6. 计算机中浮点数加法运算

    十进制浮点数加法 首先以手工过程将科学计数法表示的两个十进制数相加: 9.999*10^1 + 1.610 * 10^-1.假设有效位只有4个十进制,且指数为两个十进制数位. 步骤1:为了能让两数相加 ...

  7. 在计算机中 无符号书最常用于表示,微型计算机原理及应用试题库(无答案)

    微型计算机原理及应用试题 <微型计算机原理及应用>试题库及答案 一. 填空 1.数制转换 A)125D=( )B =( )O=( )H=( )BCD B)10110110B=( )D =( ...

  8. python的浮点数_python中浮点数的精度

    广告关闭 腾讯云11.11云上盛惠 ,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高返5000元! python中,浮点数运算,经常会碰到如下情况:? 出现上面的情况,主要还是因浮 ...

  9. 整数、浮点数在计算机中的存储,-128二进制怎么表示,

    目录 1 计算机底层存储数据的基本原理 2 整数的存储 2.1 整数的基本概念 2.2 整数的编码方式 -128的二进制表示 3浮点数存储 3.1 二进制十进制间小数怎么转换 1 计算机底层存储数据的 ...

最新文章

  1. vn.py 2.0.2 发布,全功能交易程序开发框架
  2. CGContextRef绘图-iOS球形波浪加载进度控件-HcdProcessView详解
  3. C/C++数组指针和指针数组
  4. CortexM0开发 —— LPC11C14的UART使用方法
  5. 项目管理(1):备战pmp
  6. IntelliJ Idea学习笔记004---IDEA中maven没有了
  7. docker hive nagasuga_制作一个用来调试hive的docker镜像
  8. 《Redis实战》一2.2 使用Redis实现购物车
  9. 凸优化第二章凸集 2.6 对偶锥与广义不等式
  10. 用nodejs框架Ghost快速搭建自己的网站
  11. 喜马拉雅音频批量下载
  12. 超市库存管理系统 (SSM JAVA)
  13. 51单片机控制42步进电机——程序实现(中断PWM/延时函数)
  14. AI算法工程师 | 04人工智能基础-高等数学知识强化(二)一元函数微分学
  15. NR/5G - 系统消息变更
  16. windows下服务器的数据的迁移解决方案
  17. 在选择人员定位系统是应该注意什么?
  18. 基于IGX Web SCADA平台构建 - 污水处理厂监控系统
  19. java程序员 待遇_现在的java程序员薪资待遇怎么样?
  20. 【SSL】2299护卫队

热门文章

  1. 2016年6月份学习总结,读书《向着光亮那方》
  2. Sqlserver2014怎样配置远程连接
  3. MyBatisPlus条件构造器带条件查询selectList使用
  4. Java中四种访问修饰符的区别
  5. vertica MySQL_Vertica数据库操作
  6. Dockerfile 布局的良好实践
  7. 特邀丨前阿里巴巴产品运营专家、中国计算机学会专业会员,揭秘增长共同点
  8. 老鸟运维该何去何从?
  9. MpVue开发之swiper的使用
  10. 面向对象开发===继承特点