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

数据在内存中的存储【上】


一.整型在内存中的存储

在讲解操作符的时候,我们就讲过了下面的内容:
整数的2进制表示方法有三种,即 原码、反码和补码
有符号的整数,三种表示方法均有符号位和数值位两部分,符号位都是用0表示"正",用1表示"负",最高位的一位是被当做符号位,剩余的都是数值位。
正整数的原、反、补码都相同。
负整数的三种表示方法各不相同。
TH
原码:直接将数值按照正负数的形式翻译成二进制得到的就是原码。
反码:将原码的符号位不变,其他位依次按位取反就可以得到反码。
补码:反码+1就得到补码。
对于整形来说:数据存放内存中其实存放的是二进制的补码。
为什么呢?
在计算机系统中,数值一律用补码来表示和存储。
原因在于,使用补码,可以将符号位和数值域统一处理;
同时,加法和减法也可以统一处理 (CPU只有加法器)此外,补码与原码相互转换,其运算过程是相同的,不需要额外的硬件电路。


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

在这里插入图片描述

我们以一个字节为单位调整了位置顺序,我们发现这个数字是倒着存放的,这是为什么呢?,我们先来了解什么是大小端。

1.什么是大小端?

其实超过一个字节的数据在内存中存储的时候,就有存储顺序的问题,按照不同的存储顺序,我们分为大端字节序存储和小端字节序存储,下面是具体的概念:
大端(存储)模式:
是指数据的低位字节内容保存在内存的高地址处,而数据的高位字节内容,保存在内存的低地址处。
小端(存储)模式:
是指数据的低位字节内容保存在内存的低地址处,而数据的高位字节内容,保存在内存的高地址处。上述概念需要记住,方便分辨大小端。

看图
在这里插入图片描述
在这里插入图片描述

我们这样用16进制形式来进行方便展示,实际上在内存中数据是以二进制存储的。从上面我们的运行结果来看,在我们当前的机器上是小端存放的。

2.为什么有大小端?

为什么会有大小端模式之分呢?
这是因为在计算机系统中,我们是以字节为单位的,每个地址单元都对应着一个字节,一个字节为8 bit位,但是在C语言中除了8 bit的char之外,还有16 bit的short型,32 bit 的long型(要看具体的编译器),另外,对于位数大于8位的处理器,例如16位或者32位的处理器,由于寄存器宽度大于一个字节,那么必然存在着一个如何将多个字节安排的问题。因此就导致了大端存储模式和小端存储模式。
例如:一个 16bit 的short型x,在内存中的地址为0x0010,x的值为0x1122,那么0x11为高字节,0x22为低字节。对于大端模式,就将0x11放在低地址中,即0x0010中,0x22放在高地址中,即0x0011中。小端模式,刚好相反。我们常用的X86结构是小端模式,而KEIL C51则为大端模式。很多的ARM,DSP都为小端模式。有些ARM处理器还可以由硬件来选择是大端模式还是小端模式。

我们来进行几个练习。

练习1:请简述大端字节序和小端字节序的概念,设计一个小程序来判断当前机器的字节序。

我们先来画图分析看一下

在这里插入图片描述
结果

在这里插入图片描述
所以我们当前所用机器的字节序为:小端字节序。

练习2

请看题:

在这里插入图片描述

分析
在这里插入图片描述
在这里插入图片描述

char只能存放8个比特位,所以它找8个比特位放进a中:11111111,这就是截断,就是我们4个字节的数据非得放到1个字节中要发生截断,我只保留它最低位那个字节的数据,剩下的我不要了。

所以b和c也是如此放入数据,里面放的也是11111111。但是存进去的值表示多少,还得看我们的类型,当我们存放的是相同的二进制序列的时候,要看类型怎么看待它的,这是非常重要的。

我们是用%d格式进行打印,所以a,b,c 要发生整型提升。

在这里插入图片描述

打印结果

在这里插入图片描述

站在存储的角度,它们a,b,c存放的是一样的值,当我们用它的时候,这就跟它的类型有关系了。

类型的作用:1.申请内存空间时的大小 ,2.类型决定了看待内存中数据的视角。

练习3

在这里插入图片描述

%u打印无符号的整数,所以a也要发生整型提升,因为a类型是char,所以高位就是符号位,当对a发生整型提升时,把a的高位全部补1。

在这里插入图片描述

这是我们提升完得到的补码,但是我们用%u形式打印的是无符号的整数,无符号整数是没有原反补的概念,用%u形式打印的时候,认为内存中存的是无符号数。认为我们刚刚得到的补码是无符号数的补码。没有符号位,无符号整数的原码,反码,补码是相同的。所以当我们提升完得到的补码就是它的原码。

结果

在这里插入图片描述

当以%d形式打印的时候,我们得到补码之后,还要得到它的原码,所以答案就是-128。

在这里插入图片描述

与它相似的题目,看看这个自己能不能推算出来结果。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

练习4

在这里插入图片描述

因为char类型取值范围:-128到127,虽然存放的值是-1到-1000,它肯定要发生一些变化。
strlen是求字符串长度的,这里就得关注\0的问题,其实就是找到数字为0的地方,因为它的ASCII为0,那我们怎么样才能遇到零呢?

看画好的图分析一下:

在这里插入图片描述

无符号的char,无符号位,每一位都是有效位。

在这里插入图片描述
在这里插入图片描述

当最后11111111加一变成100000000前面那个看不见了,因为char类型只能接受8个比特位,所以就变成了00000000,为零。

结果

在这里插入图片描述

练习5

在这里插入图片描述

这个答案:形成死循环,关于使用无符号变量的时候,要小心,你给出的条件会不会形成死循环。

下一道

在这里插入图片描述
在这里插入图片描述

当i减到-1的时候不会是-1,因为当把-1放到unsigned int 变量里面上去,-1的补码是全1,全都是有效位,当成全1被当成无符号数处理的时候,是一个非常大的整数,无符号整数类型变量放的值不可能小于零,所以形成死循环。-1被当成无符号数处理。

在这里插入图片描述

使用无符号整数变量的时候,大于等于零恒成立,小于某一个数的时候也可能形成死循环。

练习6

在这里插入图片描述
分析:%x是16进制的形式打印,来看图:

在这里插入图片描述

在这里插入图片描述

我们使用不同的打印格式来看打印结果。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
欧克,上篇结束,如果对你有用的话,请留下你的赞赞吧!!!

http://www.lryc.cn/news/452932.html

相关文章:

  • Prometheus之Pushgateway使用
  • Rust Web开发常用库
  • ios内购支付-支付宝APP支付提现
  • 新课发布|鸿蒙HarmonyOS Next商城APP应用开发实战
  • 基于Java,SpringBoot,Vue智慧校园健康驿站体检论坛请假管理系统
  • 【数据分享】2001-2023年我国省市县镇四级的逐月平均气温数据(免费获取/Shp/Excel格式)
  • c#代码介绍23种设计模式_16迭代器模式
  • 408算法题leetcode--第23天
  • 帝国CMS系统开启https后,无法登陆后台的原因和解决方法
  • 根据视频id查询播放量
  • 初始爬虫11
  • SSY20241002提高组T4题解__纯数论
  • Python:lambda 函数详解 以及使用
  • 【C++】空指针和野指针
  • 大模型提示词
  • 在线css像素px到Em的转换器
  • 回溯算法解决排列组合及子集问题
  • Unity中Mesh多种网格绘制模式使用方法参考
  • 【Spring Security】基于SpringBoot3.3.4版本②如何配置免鉴权Path
  • 信息学奥赛复赛复习11-CSP-J2020-04方格取数-动态规划、斐波那契数列、最优子结构、重叠子问题、无后效性
  • Hive数仓操作(十二)
  • 计算机毕业设计 基于SpringBoot和Vue的课程教学平台的设计与实现 Java实战项目 附源码+文档+视频讲解
  • 有状态(Session) VS 无状态(Token)
  • 天坑!Spark+Hive+Paimon+Dolphinscheduler
  • JAVA——IO框架
  • 项目管理系统如何实现项目申报流程自动化?
  • ndb9300public-ndb2excel简介
  • C++:const成员
  • 基于ROS的激光雷达点云物体检测
  • 大模型训练环境搭建