当前位置: 首页 > news >正文

数据在内存中的存储

这篇文章讲述的是整数、浮点数在内存中的存储,还有编译器中大端小端的含义以及我在学习内存中的见解。


1.整数在内存中的存储

在讲解操作符的时候,我们就讲过了下面的内容整数的2进制表示方法有三种,即原码、反码和补码有符号的整数,三种表示方法均有符号位和数值位两部分,符号位都是用0表示”正”,用1表示“负”,最高位的一位被当做符号位,剩余的都是数值位。

正整数的原、反、补码都相同。负整数的三种表示方法各不相同

原码:直接将数值按照正负数的形式翻译成二进制得到的就是原码。

反码:将原码的符号位不变,其他位依次按位取反就可以得到反码。

补码:反码+1就得到补码。

对于整形来说:数据存放内存中其实存放的是二进制的补码。

转换关系

当符号位为0时源反补码相同

当符号位为1时如下:

2.大小端字节序和字节序判断

大端字节序:把一个数据的低位字节的数据,存储到高地址处高位字节的数据,存储到低地址处

小端字节序:把一个数据的低位字节的数据,存储到低地址处高位字节的数据,存储到高地址处

3.练习(百度试题)

简述大小端字节序的概念,并设计一个小程序来判断字节序。

讲述一下为什么

我们从int*类型变成char*类型只取一个字节的地址

由于我们是从低地址开始取的小端是01大端是00

这里我们会有疑惑为什么char*类型的解引用后可以等于1呢?

我们得明白一个道理只要有==变量就会隐式转化为整数

还有char类型的可以打印整型也可以打印字符型,关键看用printf内的%d还是%c

我们来看一下的道题

-1的源码:10000000 00000000 00000000 000000001

反码:11111111 11111111 11111111 111111110

补码:11111111 11111111 11111111 11111111·

因为是char类型所以要截断成8位11111111·

接下来进行整型提升

我们来讲述一下什么是整型提升

以8位讲述,当是有符号位时用没截断时源码的符号位(0、1)补、当是无符号位时用0补

所以是11111111 11111111 11111111 11111111·

注意计算机只看补码而打印出来的是我们人类所理解的值(我们人类看它的源码来确定它的十进制位)

所以答案是-1 -1 255

我们来看这道题,步骤与上一题基本相似但到了·整形提升后我们知道·printf要打印的是十进制的无符号整数(%u)1111 1111 1111 1111 1111 1111 1000 0000

怎么算?直接算2^31+2^30……2^8=4294967168

这个我要讲一个事char类型的ASCLL码值为-128~127

所以图上的128实际上会转化为-128所以结果与上一题一样

给个这个图给你你可以更好理解

根据这个再来一题

我们看到根据范围他会走到0在第256个所以用sizeof(a)

返回的值为255

还有一件事unsigned char 的范围是0~255

最后一道题

答案是4 和2000000

十六进制0x00000004和0x02000000

编译器省略了数值前面的数

需要解释第二个a为首元素的地址我们不知道

0x(xxxxxxxx)当给地址强制类型转换时它会把地址理解为整数值把(xxxxxxxx)当成一个整数而后加一再强制类型转换成int*类型但是之前加了一个实际上是给地址向前走了一个字节

3.浮点数在内存中的存储·

接下来我将讲述浮点数与整数在内存中的转化

首先我们得知道它们都是以二进制存储在内存中的

整数十进制转化为二进制

浮点数十进制转化为IEEE754的公式再转化为二进制

所以答案如下:

注意:同类型的打印出来就是同类型数原本的值

3.2浮点数的存储

V=(-1)^S*(0.M或1.M)*2^E

我们看一下S,E,M在32和64位中的排布(二进制)

M到S由低地址到高地址

V指的是浮点数的值

S指的是0或1(如果V是正数S为0,V是负数S为1)

E的算法如果是整数转化为二进制从第二个开始数8个(32位),如果是浮点数把浮点数转化为二进制计算并用科学计数法表示如9 = 1.001*2^3

此时E=3+127,转化在内存里是01111000

M指的是以9 = 1.001*2^3为例

取1.xxx后的xx(32位为例)00100000000000000000000

注意:写完后要补0补到23个(32位为例)

M前的值有1也有0(1.M/0.M)当E不全为0或1时值为1.M,E全为0时为0.M,E全为1时当(M全为0)为正无穷或负无穷当(M不为全0)是非数值这些值都用二进制表示

3.2.1浮点数存的过程

IEEE754 对有效数字M和指数E,还有一些特殊规定前面说过,1≤M<2,也就是说,M可以写成1.xxxxxx的形式,其中xxxxxx表示小数部分。

IEEE754规定,在计算机内部保存M时,默认这个数的第一位总是1,因此可以被舍去,只保存后面的xxxxxx部分。比如保存1.01的时候,只保存01,等到读取的时候,再把第一位的1加上去。这样做的目的,是节省1位有效数字。以32位浮点数为例,留给M只有23位,将第一位的1舍去以后,等于可以保存24位有效数字。

至于指数E,情况就比较复杂

首先,E为一个无符号整数(unsigned int)

这意味着,如果E为8位,它的取值范围为0~255;如果E为11位,它的取值范围为0~2047。但是,我们知道,科学计数法中的E是可以出现负数的,所以IEEE754规定,存入内存时E的真实值必须再加上一个中间数,对于8位的E,这个中间数是127)对于11位的E,这个中间数是1023。

比如,21的E是10,所以保存成32位浮点数时,必须保存成10+127=137,即10001001。

判断浮点数在代码里是否相等

显然计算器认为它是错的因为存储浮点数时会有微小误差

一般在0.001左右所以用以下代码解决

If(fabs(a+b-c)<=0.01)

{

printf(“a+b=c”);

}else

{

printf(“a+b!=c”);

}

我们来讲一下fabs函数

将double型的数转化为它的绝对值

以上就是我对整数和浮点数在内存中的存储的见解,谢谢大家

http://www.jsqmd.com/news/397013/

相关文章:

  • 互联网大厂求职秘籍:Java小白面试核心技术点全解析
  • Flink 2.0 解耦状态管理(Disaggregated State)ForSt + 异步 State API V2 + SQL Async-State 上手与调优
  • 写一个自动整理聊天记录精华工具,提炼重要信息,颠覆翻记录找半天。
  • 谷歌不淡定了
  • “老东西,你懦弱了”——关于Vibe Coding与传统开发 - Ghost
  • treeNMS-1.7.5部署步骤详解(附Java环境准备与数据库配置)
  • 镜像视界核心技术群白皮书总章——空间计算引擎的技术体系全景与原创突破
  • 激光雷达(LiDAR):信号回波效率【自车能接收到反射激光的比例:10⁻¹⁰量级】【905nm激光脉冲包含10¹³光子,在200米处探测10%反射率目标,最终返到接收器的光子数只有几百~几千个】
  • 香港中巴租赁市场新动态:口碑佳企推荐,婚礼租车/自驾租车/租赁/代驾租车/婚车租赁/商务租车/跨境租车,租赁企业口碑排行 - 品牌推荐师
  • IcePop技术
  • 军储 × 危化联动空间主动封控体系装备论证——基于视频孪生感知网与镜像孪生控制网的三维空间战术级压制系统
  • 视频孪生的时代边界与镜像孪生的空间计算革命
  • 激光雷达(LiDAR)-高速运动的影响03:多普勒效应【绝大多数车载LiDAR采用飞行时间(ToF)原理,通过测量光脉冲的往返时间来计算距离,而非测量光的频率,∴多普勒效应对测距精度影响甚微】
  • 第二章 字符串和文本 上
  • “赛博大佛” Cloudflare(简称 CF)
  • 第二章 字符串和文本 下
  • 激光雷达(LiDAR):发射激光的反射为何能被自身收到【漫反射:多数物体总会将一部分入射光散射回发射源方向】【激光特性:①发散角小,即使经过漫反射,散射回的信号也足够强;②高单色性;③高能量密度】
  • 激光雷达(LiDAR)-高速运动的影响02:畸变【对一帧内所有点去畸变:①GPSIMU(打时间戳)、激光脉冲(打时间戳)⮕时间戳同步⮕坐标系变换(将点从运动中的传感器坐标系转换到固定的世界坐标系)】
  • 网站突然变慢到底是不是“服务器不行”?
  • Claude Code编程经验记录总结-构建项目规约
  • 被忽略的核心!状态转移概率矩阵:马尔可夫链的“人性破局工具”
  • 马尔可夫链的灵魂:状态转移矩阵揭秘
  • 2026年外贸推广国际社媒TikTok推广代运营公司/服务商深度测评榜单:这5家值得重点关注! - 深圳昊客网络
  • 2026年观察:国内AI选果机市场主流厂家技术解析,梨分选机/无损选果机/无损测糖选果机,选果机销售厂家怎么选择 - 品牌推荐师
  • 写作小白救星!千笔写作工具,本科生论文必备神器
  • 实测才敢推 8个降AI率工具:继续教育降AI率全维度测评
  • 救命神器!备受推崇的AI论文平台 —— 千笔
  • 毕业论文神器!降AIGC软件 千笔 VS 笔捷Ai 自考必备
  • 用数据说话 AI论文网站 千笔ai写作 VS 知文AI 专科生首选
  • 从零构建Redis认知:深入理解缓存中间件与实战购物车系统