0基础 三个月掌握C语言(13)

数据在内存中的存储

整数在内存中的存储

在讲解操作符时 我们就已经学习了该部分的内容 这里我们回顾一下

整数的二进制表示方法有三种:原码  反码  补码

有符号的整数(unsigned) 三种表达方式均有符号位和数值位两部分 最高位的一位被当作符号位 符号位用0表示正 用1表示负  除符号位之外 其余为数值位

正整数的原、反、补码都相同

负整数的三种表达方式各不相同

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

反码:将原码的符号位不变 其他位依次取反 得到的就是反码

补码:反码+1 得到补码

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

原因我这里就不过多叙述了 之前有讲过

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

下面我们先给个代码来欣赏一下

整数在内存中存储的是二进制的补码

在调试窗口中 观察内存的时候 为了方便展示 显示的是16进制的值

存储的顺序是倒过来的!

接下来我们来了解两个知识点来解决为什么这里存储的顺序是倒过来的

什么是大小端?

其实超过一个字节的数据在内存中存储的时候 就有存储顺序的问题 按照不同的存储顺序 我们分为大端字节序存储和小端字节序存储 下面是具体的概念:

大端(存储)模式:

把一个数据的低位字节的内容存储到高地址处 把高位字节的内容存储到低地址处

(举例:123 这里的3即为低位)

 小端(存储)模式:

把一个数据的低位字节的内容存储到低地址处 把高位字节的内容存储到高地址处

大小端不是以二进制位来讨论的 是以字节序来讨论的

我们之前的0x11223344的存储顺序就应该是小端存储

为什么有大小端?

这是因为在计算机系统中 我们是以字节为单位的 每个地址单元都对应着一个字节 一个字节为8bit位 但是在C语言中除了8bit位的char之外 还有16bit位的short型(要看具体的编译器) 另外 对于位数大于8位的处理器 例如16位或者32位的处理器 由于寄存器宽度大于一个字节 那么必然存着一个如何将多个字节安排的问题 因此就导致了大端存储模式和小端存储模式

练习1

这里的意思是 取n的地址 并指向地址首元素的地址  然后解引用得到该位置的值

解释:为什么我们不能写成char n

首先这种写法无法实现我们本题 其次将int型强转成char会有影响

在C或C++等语言中,当一个整型(int)被强制类型转换(cast)为字符型(char)时,内存中存储的数值实际上会发生截断。这是因为整型通常占用更多的内存空间(比如32位或64位,取决于具体的编译器和平台),而字符型通常只占用一个字节(8位)。

当进行这种转换时,只有整数值的最低有效字节(least significant byte, LSB)会被保留,并作为字符型值存储在内存中。其余的高位字节会被丢弃。

举个例子,假设在一个32位系统中,我们有一个整数值 int x = 65537(在二进制中表示为 0001 0000 0000 0001)。如果我们把这个整数值强制转换为 char 类型,只有最低的一个字节(0000 0001)会被保留,转换后的字符型值将是 1

这种转换可能会导致数据丢失,特别是当整数值大于一个字节能够表示的范围(即大于255或小于-128,取决于是有符号还是无符号字符)时。因此,在进行这种转换时需要特别小心,确保转换后的值仍然有意义。

另外,还需要注意的是,字符型在内存中实际上也是以整数形式存储的,只不过它们的解释方式(即如何映射到字符集)与普通的整型不同。在ASCII编码中,字符型值 65 对应的是大写字母 'A',而字符型值 97 对应的是小写字母 'a'。因此,整型值转换为字符型后,可能会根据当前的字符编码(如ASCII、UTF-8等)被解释为一个特定的字符

练习2

对于signed char来说 有一个特殊的存在(-128)--它在内存中存放的是10000000

我们知道有符号的数来说 最高位代表符号位

对于10000000 这里就无法对其取反 +1操作得到原码了

而是直接翻译成 -128  因为它实际上无法存放在一个字节里

如果要将-128转换成原码 应该为 110000000(最高位表示符号位 这里就9个二进制数了)

反码 101111111  补码 110000000(内存中)---所以我们记住这个特殊的数即可

signed char类型的取值范围是-128~127

对于unsigned char(无符号) 取值范围为0~255

练习3

接下来我们解释一下

这里的char在VS中 会被认为signed char

然后将 -128存放在a中 即(10000000)

当我们使用printf函数并指定%u 作为格式说明符时 相当于我们告诉printf函数要其对应的参数为一个无符号整数(unsigned int

a是一个char类型的变量。当a被传递给printf函数时,它首先会经历整型提升 

整型提升是C语言标准规定的一种隐式类型转换,用于确保小的整数类型(如charshort)在作为函数参数传递或进行算术运算时能够转换为更大的整数类型(至少为int大小)。

a作为参数传递给printf函数时,它首先被整型提升到int类型(如果intchar大)。然后,printf函数使用%u格式说明符来解释这个提升后的int值,将其作为无符号整数打印出来。

这里重要的是要理解,%u格式说明符并不“认为”aunsigned int类型;它只是告诉printf函数以无符号整数的方式解释传递给它的参数

因此,当你看到%u打印出来的值时,你实际上看到的是a的补码表示被解释为一个无符号整数的结果

练习4

在这题之前 我们给一个小知识点

signed char的取值范围为 -128~127

我们看了图之后 这题就异常简单了

练习5

由于unsigned char的取值范围 使得i满足0<=i<=255 循环不会终止

死循环

因为unsigned 是无符号数 它的值大于等于0 会一直满足i>=0

当i变成-1时  unsigned int会让其变成一个很大的正数

所以这里依旧是死循环

练习6

在指针ptr2中 对数组名a强制类型转换为整形  整形+1

再对其转换为(int*)

意思就是ptr2刚开始是指向数组首元素 整形+1 使其向后挪动一个字节的位置

(int*) ptr2表示ptr2是int类型(4个字节)的指针  表示我们从当前位置访问四个字节

即变为00 00 00 02(在内存中的存储形式---小端) 所以输出应该为20000000

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/471661.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【C语言步行梯】C语言实现扫雷游戏(含详细分析)

&#x1f3af;每日努力一点点&#xff0c;技术进步看得见 &#x1f3e0;专栏介绍&#xff1a;【C语言步行梯】专栏用于介绍C语言相关内容&#xff0c;每篇文章将通过图片代码片段网络相关题目的方式编写&#xff0c;欢迎订阅~~ 文章目录 需求分析具体实现主函数体菜单实现游戏实…

AI预测福彩3D第14弹【2024年3月20日预测--新算法重新开始计算第11次测试】

今天继续对第一套算法进行测试。废话不多说了&#xff0c;直接上分析出的图表&#xff0c;再上结果。 最终&#xff0c;经过研判分析&#xff0c;2024年3月20日福彩3D的七码预测结果如下&#xff1a; 百位&#xff1a;7 8 4 3 5 6 9(1换9) 十位&#xff1a;5 4 3 6 1 2 0(07分一…

day14-SpringBoot 原理篇

一、配置优先级 SpringBoot 中支持三种格式的配置文件&#xff1a; 注意事项 虽然 springboot 支持多种格式配置文件&#xff0c;但是在项目开发时&#xff0c;推荐统一使用一种格式的配置 &#xff08;yml 是主流&#xff09;。 配置文件优先级排名&#xff08;从高到低&…

事务同步管理器TransactionSynchronizationManager

事务同步管理器的使用场景&#xff1a; 同步涉及的资源包括&#xff1a;SqlSession & Connection。同步资源核心目的是线程共享&#xff0c;意味着必须跟线程绑定。同步资源伴随着线程生存或者消亡&#xff0c;意味着线程结束之前必须手动清除其绑定的资源。事务同步管理器…

基于SpringBoot+Redis实现接口限流

前言 业务中需要对一些接口进行限流处理&#xff0c;防止机器人调用或者保证服务质量&#xff1b; 实现方式 基于redis的lua脚本 引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis&…

Linux Deepin系统安装x11vnc+cpolar实现Windows系统电脑远程其桌面

文章目录 1. 安装x11vnc2. 本地远程连接测试3. Deepin安装Cpolar4. 配置公网远程地址5. 公网远程连接Deepin桌面6. 固定连接公网地址7. 固定公网地址连接测试 x11vnc是一种在Linux系统中实现远程桌面控制的工具&#xff0c;它的原理是通过X Window系统的协议来实现远程桌面的展…

linux用git拉取我云端以及git处理冲突

拉取后切换一个跟云端分支(dev)一样的 git branch --set-upstream-toorigin/dev dev 之后就同步了 A在dev分支写了iii,提交 B在dev分支写了hhh,提交,冲突 怎么修改,B把云端的拉下来,随便改改就行

YOLOv7 | 添加GSConv,VoVGSCSP等多种卷积,有效提升目标检测效果,代码改进(超详细)

⭐欢迎大家订阅我的专栏一起学习⭐ &#x1f680;&#x1f680;&#x1f680;订阅专栏&#xff0c;更新及时查看不迷路&#x1f680;&#x1f680;&#x1f680; YOLOv5涨点专栏&#xff1a;http://t.csdnimg.cn/QdCj6 YOLOv7专栏&#xff1a; http://t.csdnimg.cn/dy…

Qt 多元素控件

Qt开发 多元素控件 Qt 中提供的多元素控件有: QListWidgetQListViewQTableWidgetQTableViewQTreeWidgetQTreeView xxWidget 和 xxView 之间的区别 以 QTableWidget 和 QTableView 为例. QTableView 是基于 MVC 设计的控件. QTableView 自身不持有数据. 使用QTableView 的 …

latex如何让标题section取消数字标号

解决方法——加一个*号 在LaTeX中&#xff0c;如果你想让section标题取消数字标号&#xff0c;可以使用section*代替section。section*将生成一个不带数字标号的节标题。 例如&#xff0c;你可以这样写&#xff1a; \section*{这是不带数字标号的节标题}这将生成一个标题&am…

给老婆整了个短剧搜索机器人APP

最近短剧挺火&#xff0c;很多群友们都在做一些资源分享&#xff0c;老胡于是基于这些资源做了个短剧搜索引擎&#xff0c;挺多朋友喜欢看的&#xff0c;我老婆也在看哈哈&#xff0c;真上头&#xff0c;废话不多说&#xff0c;上短剧机器人。 短剧机器人 直接在微信群输入&…

解决由于历史原因解析tflite失败的问题

文章目录 0. 背景1. tflite 历史遗留问题2. schema3. flatbuffers 编译器3.1 安装 FlatBuffers 编译器3.2. 编译 FlatBuffers schema 文件3.3 使用生成的 Python 文件 4 问题未解决终极解决方案 写在最前面&#xff1a;解决方法是升级tensorflow版本&#xff0c;重新生成tflite…

【go从入门到精通】if else 条件控制

Go 语言条件语句&#xff1a; 在 Go 语言中&#xff0c;条件语句用于根据不同的条件执行不同的代码。Go 语言提供了两种条件语句&#xff1a;if 语句和switch 语句。 if语句 if由一个布尔表达式后紧跟一个或多个语句组成。 语法 Go 编程语言中 if 语句的语法如下&#xff…

反向海淘系统中的数据安全挑战与解决方案探讨

**反向海淘系统中的数据安全挑战与解决方案探讨** **一、背景** 随着反向海淘市场的不断扩大&#xff0c;涉及的数据安全挑战也日益增多。本文旨在探讨反向海淘系统中面临的数据安全挑战&#xff0c;以及相应的解决方案。 **二、数据安全挑战** 1. **数据传输安全**&#x…

微信支付宝--充ChatGPTPLUS/openAI key

ChatGPT是人工智能技术驱动的自然语言处理工具&#xff0c;它能够基于在预训练阶段所见的模式和统计规律&#xff0c;来生成回答&#xff0c;还能根据聊天的上下文进行互动&#xff0c;真正像人类一样来聊天交流&#xff0c;甚至能完成撰写论文、邮件、脚本、文案、翻译、代码等…

【Python】反编译PyInstaller打包的exe

查看exe基本信息 需要反编译的exe 查看exe文件的打包工具&#xff0c;查看exe信息的软件叫Detect It Easy(查壳工具) 由图我们可以看出当前选中的exe文件是由名叫PyInstaller的打包工具打包好的exe 反编译 exe反编译工具&#xff1a;pyinstxtractor.py 使用方法 python py…

面试算法-65-二叉树的层平均值

题目 给定一个非空二叉树的根节点 root , 以数组的形式返回每一层节点的平均值。与实际答案相差 10-5 以内的答案可以被接受。 示例 1&#xff1a; 输入&#xff1a;root [3,9,20,null,null,15,7] 输出&#xff1a;[3.00000,14.50000,11.00000] 解释&#xff1a;第 0 层的…

【Spring高级】AOP和动态代理

目录 AspectJ实现AOPJava Agent实现AOPProxy&#xff08;代理&#xff09;模式实现AOPJDK代理CGLIB代理 AOP的底层实现切点Aspect与Advisor切面AOP底层的实现演示 Spring中的代理选择 在Java中&#xff0c;AOP&#xff08;面向切面编程&#xff09;的实现可以通过以下几种方法&…

MySQL的日志:undo log、redo log、binlog有什么作用

目录 从一个update语句说起 undo log 为什么需要undo log undo log 版本链 undo log 是如何持久化到磁盘? redo log 为什么需要redo log redo的组成 redo Log的刷盘策略 redo Log循环写 crash-safe能力 binlog 为什么需要 binlog &#xff1f; binlog与redo lo…

淘宝API接口开发系列——淘宝详情数据采集

淘宝详情数据采集涉及多种技术和方法&#xff0c;下面列举几种常见的方式&#xff1a; 请求示例&#xff0c;API接口接入Anzexi58 爬虫技术&#xff1a;使用编程语言&#xff08;如Python&#xff09;编写网络爬虫程序&#xff0c;通过模拟浏览器行为访问淘宝网站&#xff0c;…