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


一.整型在内存中的存储

在讲解操作符的时候,我们就讲过了下面的内容:
整数的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.mzph.cn/diannao/55353.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数据结构——计数、桶、基数排序

目录 引言 计数排序 1.算法思想 2.算法步骤 3.代码实现 4.复杂度分析 桶排序 1.算法思想 2.算法步骤 3.代码实现 4.复杂度分析 基数排序 1.算法思想 2.算法步骤 3.代码实现 4.复杂度分析 排序算法的稳定性 1.稳定性的概念 2.各个排序算法的稳定性 结束语 引…

在WPF中实现多语言切换的四种方式

在WPF中有多种方式可以实现多语言,这里提供几种常用的方式。 一、使用XML实现多语言切换 使用XML实现多语言的思路就是使用XML作为绑定的数据源。主要用到XmlDataProvider类. 使用XmlDataProvider.Source属性指定XML文件的路径或通过XmlDataProvider.Document指定…

IDEA 系列产品 下载

准备工作 下载 下载链接:https://www.123865.com/ps/EF7OTd-yVHnH 仅供参考 环境 演示环境: 操作系统:windows10 产品:IntelliJ IDEA 版本:2024.1.2 注意:如果需要其他产品或者版本可以自行下载&#xff0…

深入理解Dubbo源码核心原理-Part3

到此开始讲解Dubbo消费端的源码 在消费一端,需要关注两件事情。第一,接口的proxy如何生成。第二,请求如何发送。 首先看到启动类 接下来看真正inject方法 现在需要思考,待注入的Bean从哪儿来,这个Bean必然注入的是一…

(16)MATLAB仿真Nakagami-m分布1

文章目录 前言一、Nakagami分布二、MATLAB建模代码三、仿真结果画图四、总结 前言 Nakagami衰落模型最初是由于该模型与短波电离层传播的经验结果相匹配而提出的。它还用于仿真来自多个干扰源的情况,因为多个独立且同分布(i.i.d)的瑞利分布随…

Flask-3

文章目录 ORMFlask-SQLAlchemySQLAlchemy中的session对象数据库连接设置常用的SQLAlchemy字段类型常用的SQLAlchemy列约束选项 数据库基本操作模型类定义 数据表操作创建和删除表 数据操作基本查询SQLAlchemy常用的查询过滤器SQLAlchemy常用的查询结果方法多条件查询分页器聚合…

Ajax ( 是什么、URL、axios、HTTP、快速收集表单 )Day01

AJAX 一、Ajax是什么1.1名词解释1.1.1 服务器1.1.2 同步与异步1. 同步(Synchronous)2. 异步(Asynchronous)3. 异步 vs 同步 场景4. 异步在 Web 开发中的常见应用: 1.2 URL 统一资源定位符1.2.1 URL - 查询参数1.2.2 ax…

JavaSE——面向对象8:Object类详解(==与equals的区别、hashCode、toString方法)

目录 一、与equals()的区别 (一)是一个比较运算符 (二)equals是Object类中的方法,只能判断引用类型 (三)equals方法重写练习 1.练习1 2.练习2 3.练习3 二、hashCode方法 三、toString方法 1.默认返回:全类名(包名类名)哈希值的十六进制 (1)不…

unreal engine5制作动作类游戏时,我们使用刀剑等武器攻击怪物或敌方单位时,发现攻击特效、伤害等没有触发

UE5系列文章目录 文章目录 UE5系列文章目录前言一、问题分析二、解决方法1. 添加项目设置碰撞检测通道2.玩家角色碰撞设置3.怪物角色碰撞预设 最终效果 前言 在使用unreal engine5制作动作类游戏时,我们使用刀剑等武器攻击怪物或敌方单位时,发现攻击特效…

基于Hive和Hadoop的用电量分析系统

本项目是一个基于大数据技术的用电量分析系统,旨在为用户提供全面的电力消耗信息和深入的用电量分析。系统采用 Hadoop 平台进行大规模数据存储和处理,利用 MapReduce 进行数据分析和处理,通过 Sqoop 实现数据的导入导出,以 Spark…

Python中流行的开源OCR项目

以下是一些Python中流行的开源OCR项目: PaddleOCR:由百度开发的OCR工具库,支持多种语言的文字识别,包括中英文,同时支持倾斜、竖排等多种方向的文字识别。它提供了超轻量级的PP-OCRv3模型,适合在资源受限的…

`git restore` 和 `git checkout` 用于丢弃工作区的改动, `git switch` 和 `git checkout` 用来切换分支

git restore 和 git checkout 都可以用于丢弃工作区的改动 但它们有一些区别,尤其是在 Git 2.23 引入了新的命令后。 主要区别 git checkout 是一个多用途命令: 它用于切换分支。它还可以用于恢复工作区中特定文件的更改。由于功能过于复杂&#xff0c…

Flutter 3.24 AAPT: error: resource android:attr/lStar not found.

在Android build,gradle下面,添加右边红框的代码: subprojects {afterEvaluate { project ->if (project.plugins.hasPlugin("com.android.application") ||project.plugins.hasPlugin("com.android.library")) {project.androi…

【MySQL】SQL介绍+基础+DDL+数据备份+还原

目录 一、DDL建库建表 1. 数据库 2. 内部4特征 3. 外部4特征 4. 数据库结构 5. SQL语句分类(重点) 6. 注意 7. 数据库表的字段类型 8. 存储引擎 9. 数据库表的操作 二、三范式 1. 什么是范式 2. 约束作用 3. 三范式 4. 第一范式&#xff…

【Android 14源码分析】Activity启动流程-2

忽然有一天,我想要做一件事:去代码中去验证那些曾经被“灌输”的理论。                                                                                  – 服装…

Visual Studio C# 编写加密火星坐标转换

Visual Studio C# 编写加密火星坐标转换 1、WGS84坐标转GCJ02火星坐标2、GCJ02火星坐标转WGS84坐标(回归计算)3、GCJ02火星坐标转BD09百度坐标4、BD09百度坐标转GCJ02火星坐标(回归计算)5、坐标公共转换类6、地图显示7、程序简单界…

检查jar冲突,查找存在相同class的jar

写在前面 本文看下如何查找jar冲突,即查找哪些jar包中存在相同的class。如果是存在相同jar的不同版本,基本一眼就能看出来,然后结合maven的依赖关系将其剔除掉即可,但是当你遇到了有人手动拷贝某些class到jar包中导致冲突的情况时…

【AI知识点】维度灾难(curse of dimensionality)

维度灾难(curse of dimensionality) 是指在处理高维数据时,随着维度的增加,数据的性质和空间结构变得越来越复杂,导致许多常见的算法和技术在高维空间中效率低下或效果变差的问题。 这个概念最早是由Richard Bellman在…

OpenCAEPoro安装与测试(ASC 2024)

首先简单总结一下经验: 在之前的测试和学习中,由于自己是虚拟机或者云服务器,有root权限,经常无脑增删文件(主要是为了图省事,看见报错就加回来,多出来就删除),但是在经…

Ubuntu Server 20.04 64bit定时备份MySQL8.0.36数据库数据

一、编写sh脚本 常见备份命令介绍 我选用的是mysqldump命令,命令使用简介 [root]> mysqldump -helpUsage: mysqldump [OPTIONS] database_name [tables] OR mysqldump [OPTIONS] --databases [OPTIONS] DB1 [DB2 DB3...] OR mysqldump [OPTIONS] --all…