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

C++浮点数存储方式 C++中的,也被称为。 阅读详情

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

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

        符号位    阶码        尾数
float    1(31)   8(30~23)  23(22~0)
double   1(63)  11(62~52)  52(51~0)

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

阶码:阶码使用移码表示。对于float型数据,规定其偏移量为127,阶码有正有负,对于8bit二进制,则其表示范围为-128~127;double型数据规定其偏移量为1023,其表示范围为-1024~1023,。例如,对于float型数据,其真实阶码为2,则加上127后为129,其阶码的二进制表示为:1000 0001。

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

举例说明:

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

        符号位:正数,符号位为0

        尾数:125.5转换成二进制为:1111101.1,所以尾数为1.1111011,因尾数的整数部分固定为1,不进行存储。所以尾数的二进制表示为:1111011,在其后面补0,使其达到23位,则为:1111 0110 0000 0000 0000 000

        阶码:125.5转换成二进制为:1111101.1,所以其阶码的真实值为6,偏移量为127,所以阶码为133.用二进制表示为:1000 0101

则其二进制表示为:0 1000 0101 1111 0110 0000 0000 0000 000

小端存储         大端存储
0000 0000    1000 0101    低地址
0000 0001    111 01100 
111 01100    0000 0001
1000 0101    0000 0000    高地址

而反过来若要根据二进制形式求算浮点数如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。上面程序输出结果验证了其正确性。

C++浮点型变量的存储方式 1 浮点类型简介 浮点型是C++定义的基本类型。类型float、double和long double分别表示单精度浮点数、双精度浮点数和扩展精度浮点数。在Visual Studio中,float类型用4个字节表示,double和long double用8个字节表示。 默认的浮点字面值常量为double类型。在数值的后面加上F或者f表示单精度,在数值后面加上L或者l表示扩展精度。 fl... 阅读详情

相关推荐

深入C/C++浮点数在内存中的存储方式详解

本篇文章是对C/C++浮点数在内存中的存储方式进行了详细的分析介绍,需要的朋友参考下

数据类型在内存中的存储(整形,浮点型)

1.数据类型的详细介绍 2.整形在内存中的存储: unsigned short[int]括号表示可省略 signed short [int] unsigned int signed int unsigned long[int] 括号表示可省略 signed long [int] unsigned char 浮点数的储存规则,将浮点数V存入内存,从内存中取出浮点数V时(按指数E)可以分成三种情况

sun的博客 1951

海康/大华设备如何接入GB28181平台?最新2022版互联避坑指南

本文详细解析了海康/大华设备接入GB28181平台的最新2022版互联避坑指南,涵盖参数配置、实时视音频点播协议交互及典型故障排查。重点介绍了GB/T28181-2022标准下的设备编码规范、SIP服务器配置及媒体流保活机制,帮助工程团队高效解决设备离线和媒体流中断等问题。

weixin_30733003的博客 687

C语言|数据的存储

自学时的记录。

weixin_43988792的博客 514

Golang中使用Qt库(therecipe/qt)+QtDesigner + Goland (一) 环境搭建

搭建的目的只是刚好看到有这么一个模块, 还有给使用Go的人需要用到调试界面的时候用一下,真正开发界面并不建议用,没必要, 还有缺点就是在windows平台下编译偏慢, 还有其他一些UI纯Go开发的UI -

听我一言的博客 1万+

liquibase介绍

1、Liquibase还是Flyway Flyway和Liquibase都支持专业数据库重构和版本控制所需的所有功能,因此您将始终知道要处理的数据库模式的版本以及它是否与软件版本匹配。两种工具都集成在Maven或Gradle构建脚本中以及Spring Boot生态系统中,因此您可以完全自动化数据库重构。 Flyway使用SQL定义数据库更改,因此您可以定制SQL脚本,使其与基础数据库技术(例如Oracle或PostgreSQL)良好地配合使用。另一方面,使用Liquibase,您可以通过使用XML,YA

赶路人儿 7534

【C/C++】浮点数在内存中的储存

IEEE 754标准,( M ) 是有效数字。( M ) 是有效数字。位于内存中的最后一部分。( S ) 是符号位。( S ) 是符号位。

bitenum的博客 808

国产NAS哪家强?极空间&绿联&威联通&群晖对比

随着个人数据量暴增,传统网盘空间不足和下载速度慢问题愈发凸显。新势力NAS,作为数据管理领域的璀璨新星,正以其独特的互联网设计理念,引领家庭及小型办公用户向数据存储的新纪元。它不仅仅是一款产品,更是为初学者用户量身定制的贴心伙伴。其系统界面之简洁、操作流程之直观,让人一目了然,真正实现了“即插即用”的极致便捷。同时,新势力NAS在保持专业水准的同时,更提供了多样化的扩展性配置,轻松应对各种数据存储与管理需求,让家庭及小型办公场景下的数据管理变得前所未有的简单与高效。

专注大数据、云计算、人工智能、机器人领域技术传播 3647

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

                                                            C/C++浮点数在内存中的存储方式        任何数据在内存中都是以二进制的形式存储的,例如一个short型数据1156,其二进制表示形式为00000100 10000100。则在Intel CPU架构的系统中,存放方式为  10000100(低地址单元) 00000100...

weixin_34138377的博客 254

spm FMRI 各种小问题合集

预处理 1、预处理结果从normalize之后开始头歪、变形 问题描述:如下图 原因:DICOM2NIfTI时必须检查对应的T1像。下面是两种错误形式,第一种容易发现,第二种容易忽视,大脑失状位左右颠倒。 解决:重新转了一回格式,建议用SPM fmri进行格式转换。之前是用MRIconvert转换的,用了两台电脑,有的T1结果是对的,不确定什么原因产生的错位,操作都是一样的。 2、Check reg大脑图片边缘出边框 问题描述: 原因:应该是图片排版导致的,单独check就会发现大脑是全的。 解决

weixin_44669441的博客 1677

AD9361功能介绍和使用

AD9361使用分数分频锁相环(PLL)来产生发射机和接收机本地振荡器(LO)频率和BB PLL。BB PLL 可用于数据转换、数字滤波器和 |/O 端口。PLL的参考时钟可以由外部振荡器或外部晶体(XO)和数字可编程片内可变电容提供,电容微调产生参考时钟频率,XO和微调电容的组合统称为DCXO。有多个天线输入的分集系统。接收链数据首先经过低噪声放大器(LNA),然后是同相(1)和正交(Q)放大器,混频器和频带整形滤波器,可将接收到的信号下变频为基带以进行数字化。时分双工(TDD)和频分双工(FDD)。。。

wangjie36的博客 1万+

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

本文转自:https://www.cnblogs.com/dolphin0520/archive/2011/10/02/2198280.html                                                             C/C++浮点数在内存中的存储方式        任何数据在内存中都是以二进制的形式存储的,例如一个short型数据1156,其二...

Primeprime的专栏 427

YOLO26改进策略【卷积层】| HWD,引入`Haar小波变换`到下采样模块中,减少信息丢失

本文记录的是。传统的卷积神经网络中常用的最大池化平均池化和步长为2的卷积等操作进行下采样可能会导致信息丢失,为了解决信息丢失问题,HWD作者受无损信息变换方法的启发,引入Haar小波变换到下采样模块中,

Limiiiing的博客 346

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

那天有人在汇编群里有人问了一个 #include <iostream>#include <stdio.h>using namespace std; int main(){ int a; a = 3; printf("%lf\n",a); return 0;} 为什么输出0的问题。而且最近计算机组成原理里面有过对浮点型储存的讲解,所以这里就查了...

weixin_30835649的博客 111

用 CDS View I_APARToleranceGroup 管理客户与供应商收付差异容差:配置语义、字段解读与 ABAP 落地实践

财务共享服务中心常面临小额差异处理的挑战,SAP通过"客户/供应商容差组"机制实现自动清账规则配置。CDS视图I_APARToleranceGroup将配置数据转化为可查询维度,包含宽限天数、固定现金折扣等关键业务参数。该视图支持按公司代码和容差组查询差异处理策略,可用于报表开发、主数据校验和接口合规检查,帮助财务团队高效管理海量小额交易差异,减少手工操作。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 127

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

【C语言中的细节问题】C/C++浮点数在内存中的存储方式

C/C++浮点数在内存中的存储方式 本文转载自:https://www.cnblogs.com/dolphin0520/archive/2011/10/02/2198280.html        任何数据在内存中都是以二进制的形式存储的,例如一个short型数据1156,其二进制表示形式为00000100 10000100。则在Intel CPU架构的系统中,存放方式为  10000100(...

zl3090的博客 311

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

上一篇: C++编程规范之命名规范
下一篇: #define用法详解
Simple_Man_Just
博客等级 码龄11年 18粉丝 43原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值