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

news2024/11/30 14:31:58

数据在内存中的存储

整数在内存中的存储

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

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

有符号的整数(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

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

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

相关文章

Tensorflow2.0笔记 - Himmelblau函数优化案例

本笔记记录Himmelblau函数优化案例代码&#xff0c;包括函数的图形绘制和梯度下降求解局部最优解的过程。 import tensorflow as tf import numpy as np from mpl_toolkits.mplot3d import Axes3D from matplotlib import pyplot as plt tf.__version__#Himmelblau函数 #https…

使用vitepress生成文档博客简单demo

先创建个空目录(就是你的项目) 安装vitepress 就是在你刚创建的目录里安装vitepress&#xff1a; npm add -D vitepress初始化项目 还是在你刚操作的目录里执行&#xff1a; npx vitepress init然后按照命令行的指引一步一步走就好了 注意VitePress的项目位置&#xff0c…

网站引用图片但它域名被墙了或者它有防盗链,我们想引用但又不能显示,本文附详细的解决方案非常简单!

最好的办法就是直接读取图片文件&#xff0c;用到php中一个常用的函数file_get_contents(图片地址)&#xff0c;意思是读取远程的一张图片&#xff0c;在输出就完事。非常简单&#xff5e;话不多说&#xff0c;直接上代码 <?php header("Content-type: image/jpeg&quo…

【FPGA】摄像头模块OV5640

本篇文章包含的内容 一、OV5640简介1.1 基本概述1.2 工作时序1.2.1 DVP Timing&#xff08;数据传输时序&#xff09;1.2.2 帧曝光工作模式 1.3 OV5640 闪光灯工作模式1.3.1 Xenon Flash&#xff08;氙灯闪烁&#xff09;模式1.3.2 LED 1&2 模式1.3.3 LED 3模式1.3.4 手动开…

● 647. 回文子串 ● 516.最长回文子序列 ● 动态规划总结篇

● 647. 回文子串 1.dp数组含义。 之前的题目&#xff0c;差不多都是求什么就怎么定义dp数组&#xff0c;最后返回dp的最后一个元素。但是这里如果定义一维数组dp[i]是[0,i]范围的回文子串的个数的话&#xff0c;怎么根据dp[i-1]得到dp[i]&#xff1f;发现很难找到递归关系…

2078: [蓝桥杯2023初赛] 01 串的熵

对于一个长度为 n 的 01 串 S x1x2x3...xn. 香农信息熵的定义为&#xff1a; 。 其中 p(0), p(1) 表示在这个 01 串中 0 和 1 出现的占比。 比如&#xff0c;对于S 100 来说&#xff0c;信息熵 H(S ) - 1/3 log2(1/3) - 2/3 log2(2/3) - 2/3 log2(2/3) 1.3083。 对于一个…

CSharp的lambda表达式匿名类扩展方法

c#的lamba表达式 之前已经写过一些关于委托还有事件的文章&#xff0c;今天就来介绍一下lambda表达式。 首先定义需要的函数以及委托 { public delegate void DoNothingDelegate(); public delegate void StudyDelegate(int id, string name);private void DoNothing() {Cons…

PTA一笔画

作者 张志梅 单位 青岛大学 小丁最近迷恋上一个游戏&#xff0c;传说中的“一笔画”游戏。 那么什么是一笔画&#xff1f;如下图&#xff0c;顾名思义就是一笔可以完成的图。一笔画最基本的要求是在画图的过程中&#xff0c;笔不能离开纸&#xff0c;且笔所画过的线不能重复…

企业培训考试系统数字化解决方案优势有哪些?

企业员工内部培训考试系统&#xff0c;用数字技术和互联网平台&#xff0c;为企业提供高效、便捷、个性化的员工培训服务的解决方案。 企业员工培训考试数字化解决方案不仅能够提供更加高效、灵活和互动的学习体验&#xff0c;还能够帮助企业实现长期的人才发展战略&#xff0…

Go语言之函数、方法、接口

一、函数 函数的基本语法&#xff1a; func 函数名&#xff08;形参列表&#xff09;&#xff08;返回值列表&#xff09; {执行语句...return 返回值列表 } 1.形参列表&#xff1a;表示函数的输入 2.函数中的语句&#xff1a;表示为了实现某一功能的代码块 3.函数可以有返回…

ARM32day4

1.思维导图 2.实现三个LED灯亮灭 .text .global _start _start: 使能GPIO外设时钟 LDR R0,0x50000A28 LDR R1,[R0]使能GPIOE ORR R1,R1,#(0X1<<4)使能GPIOF ORR R1,R1,#(0X1<<5) STR R1,[R0]设置引脚状态 LDR R0,0X50006000 LDR R1,[R0] 设置PE10为输出 BIC…

PTA L2-022 重排链表

给定一个单链表 L1​→L2​→⋯→Ln−1​→Ln​&#xff0c;请编写程序将链表重新排列为 Ln​→L1​→Ln−1​→L2​→⋯。例如&#xff1a;给定L为1→2→3→4→5→6&#xff0c;则输出应该为6→1→5→2→4→3。 输入格式&#xff1a; 每个输入包含1个测试用例。每个测试用例…

12|检索增强生成:通过RAG助力鲜花运营

什么是 RAG&#xff1f;其全称为 Retrieval-Augmented Generation&#xff0c;即检索增强生成&#xff0c;它结合了检 索和生成的能力&#xff0c;为文本序列生成任务引入外部知识。RAG 将传统的语言生成模型与大规模 的外部知识库相结合&#xff0c;使模型在生成响应或文本时可…

HarmonyOS NEXT应用开发之元素超出List区域

介绍 本示例介绍在List组件内实现子组件超出容器边缘的布局样式的实现方法。 List组件clip属性默认为true&#xff0c;超出容器边缘的子组件会按照List的布局范围被裁剪。为此&#xff0c;可以在List组件内部添加一个占位的ListItem&#xff0c;以达到预期的布局效果。List占…

什么是组态软件?Web组态软件又是什么?

从事相关工作的对“组态软件”应该都不陌生&#xff0c;那Web组态软件又是什么呢?本文将对Web组态可视化软件&#xff08;下称“Web组态软件”&#xff09;做简单介绍&#xff0c;可视化编辑器是Web组态软件中的一个重要功能模块。除了编辑器&#xff0c;还有哪些功能模块?又…

腾讯云服务器多少钱一个月?5元1个月,这价格没谁了

2024腾讯云服务器多少钱一个月&#xff1f;5元1个月起&#xff0c;腾讯云轻量服务器4核16G12M带宽32元1个月、96元3个月&#xff0c;8核32G22M配置115元一个月、345元3个月&#xff0c;腾讯云轻量应用服务器61元一年折合5元一个月、4核8G12M配置646元15个月、2核4G5M服务器165元…

亚信安慧AntDB:数字化创新背后的数据力量

亚信安慧AntDB的“融合实时”的特性&#xff0c;不仅使得数据库具备了更强大的适应性&#xff0c;更让企业在不同业务场景下能够更好地实现业务目标&#xff0c;释放出更大的商业价值。融合实时的特性让AntDB具有了高度灵活性和实时性&#xff0c;使其能够满足企业在不同业务需…

为 java 开发者设计的性能测试框架,用于压测+测试报告生成

拓展阅读 junit5 系列教程 基于 junit5 实现 junitperf 源码分析 Auto generate mock data for java test.(便于 Java 测试自动生成对象信息) Junit performance rely on junit5 and jdk8.(java 性能测试框架。压测测试报告生成。) junitperf junitperf 是一款为 java 开…

MQ之Spring AMQP学习

Spring AMQP学习 Spring AMQP AMQP是Advanced Message Queuing Protocol的缩写。AMQP是用于在应用程序之间传递消息的开放标准&#xff0c;该协议与语言和平台无关&#xff0c;更符合微服务中独立性的要求。 Spring AMQP是基于AMQP协议定义的一套API规范&#xff0c;提供了模…

JavaScript高级(十八)---进程和线程,宏任务和微任务

进程和线程 进程&#xff08;process&#xff09;&#xff1a;计算机已经运行的程序&#xff0c;是操作系统管理程序的一种方式&#xff0c;我们可以认为&#xff0c;启动一个应用程序&#xff0c;就会默认启动一个进程&#xff08;也可能是多个进程&#xff09;。 线程&…