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

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

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

相关文章

文件包含漏洞之包含SESSION(CTF题目)

这次使用的环境是ubuntunginxphpmysql 首先四个文件源码在以下链接中&#xff1a; 一道CTF题&#xff1a;PHP文件包含 | Chybeta 我们注册一个用户名111密码111&#xff0c;然后登录查看cookie和linux的session&#xff0c;因为我们的de服务器 是手动搭建的&#xff0c;所以…

Java IO模型

NIO Java IO 模型1. 什么是IO计算机结构角度应用程序角度 2. 常见的内存模型3. Java中常见的IO模型3.1 BIO&#xff08;Blocking I/O&#xff09;3.2 NIO&#xff08;Non-blocking/New I/O&#xff09;同步非阻塞 IO 模型I/O 多路复用模型 3.3 AIO&#xff08;Asynchronous I/O…

Python从入门到精通秘籍八

一、Python中函数的多返回值 在Python中&#xff0c;函数可以返回多个值。这种特性可以通过将多个变量包装在一个元组或列表中来实现。下面是一个示例代码&#xff1a; def multiple_returns():a 1b 2c 3return a, b, cresult multiple_returns() print(result) # 输出&…

Spring6.1新特性,四种方式调用REST接口(RestClient、WebClient、RestTemplate、HTTP Interface)

个人博客&#xff1a;无奈何杨&#xff08;wnhyang&#xff09; 个人语雀&#xff1a;wnhyang 共享语雀&#xff1a;在线知识共享 Github&#xff1a;wnhyang - Overview 官网 REST Clients :: Spring Framework The Spring Framework provides the following choices for…

电子元器件批发采购中的供应链透明度与可追溯性

电子元器件批发采购中的供应链透明度与可追溯性是非常重要的&#xff0c;特别是考虑到供应链的复杂性和全球化。以下是一些关于如何增强供应链透明度和可追溯性的建议&#xff1a; 供应商审核与选择&#xff1a;对潜在的供应商进行全面的审核和评估&#xff0c;了解其供应链结构…

Leetcode-06-Z字形变换

将一个给定字符串 s 根据给定的行数 numRows &#xff0c;以从上往下、从左到右进行 Z 字形排列。 比如输入字符串为 "PAYPALISHIRING" 行数为 3 时&#xff0c;排列如下&#xff1a; P A H N A P L S I I G Y I R 之后&#xff0c;你的输出需要从左往右…

【Leetcode】1793. 好子数组的最大分数

文章目录 题目思路代码复杂度分析时间复杂度空间复杂度 结果总结 题目 题目链接&#x1f517; 给你一个整数数组 n u m s nums nums &#xff08;下标从 0 0 0 开始&#xff09;和一个整数 k k k 。 一个子数组 ( i , j ) (i, j) (i,j) 的 分数 定义为 m i n ( n u m s …

ROS2从入门到精通0-3:VSCode 搭建 ROS2 工程环境

目录 0 专栏介绍1 Ubuntu下安装VSCode1.1 基本安装1.2 将VSCode添加到侧边栏 2 VSCode集成相关插件3 VSCode运行ROS2环境步骤3.1 安装编译依赖项3.2 创建工作空间和源码空间3.3 启动VSCode与配置 4 测试工程环境4.1 C版本4.2 Python版本 0 专栏介绍 本专栏旨在通过对ROS2的系统…

一、初识 web3

瑾以此系列文章&#xff0c;献给那些出于好奇并且想要学习这方面知识的开发者们 在多数时间里&#xff0c;我们对 web3 的理解是非常模糊的 就好比提及什么是 web1 以及 web2&#xff0c;相关概念的解释是&#xff1a; 1. 从 Web3 的开始 Web3&#xff0c;也被称为Web3.0&…

idea error java:compilation failed:internal java compiler error

idea中编译运行maven项目报错如下 idea error java:compilation failed:internal java compiler error 尝试如下操作 注意&#xff1a;jdk8 需要设置4个地方 1.首先打开File->Project Structure中的Project&#xff0c;将SDK和language level都设置一致&#xff0c;如下…

大语言模型无代码构建知识图谱+视频链接

之前通过系列文章介绍了如何利用HugggingFists系统无代码构建知识图谱&#xff0c;这次给出视频&#xff0c;方便大家更直观的了解如何操作。视频链接如下&#xff1a; 《玩转数据之利用LLM构建知识图谱》 文章链接&#xff1a; 《大语言模型无代码构建知识图谱(1)--提示工程准…

基于Java的考研专业课程管理系统(Vue.js+SpringBoot)

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 数据中心模块2.2 考研高校模块2.3 高校教师管理模块2.4 考研专业模块2.5 考研政策模块 三、系统设计3.1 用例设计3.2 数据库设计3.2.1 考研高校表3.2.2 高校教师表3.2.3 考研专业表3.2.4 考研政策表 四、系统展示五、核…

2024届 C++ 刷题 笔试强训 Day 03

选择题 01 以下程序的输出结果是&#xff08;&#xff09; #include <stdio.h> void main() {char a[10] {1, 2, 3, 4, 5, 6, 7, 8, 9, 0}, *p;int i;i 8;p a i;printf("%s\n", p - 3); }A 6 B 6789 C ‘6’ D 789 题目解析&#xff1a; 题目中定义了一个…

js改变页面上输入框的值

方案一&#xff08;大众方案包含vue和原生js的输入框&#xff09; // 填写输入框内容&#xff0c;并且赋值给输入框 function fillInput(input, value) {input.value value;input.dispatchEvent(new Event(input, {bubbles: true,cancelable: true,composed: true}));// 所以…

文件操作:文本文件(写/读)

文件操作可以将数据永久化&#xff0c;C中对文件操作需要包含头文件 < fstream > 文件类型分为两种&#xff1a; 1. 文本文件&#xff1a;文件以文本的ASCII码形式存储在计算机中 2. 二进制文件&#xff1a;文件以文本的二进制形式存储在计算机中&#xff0c;…

matplotlib绘制统计特征图和分布特征图

文章目录 一、统计特征图绘制1.需求2.代码方法一方法二总结 二、分布特征图绘制1.需求2.代码 一、统计特征图绘制 1.需求 我现在有两个数据集Pdata和Cdata分别在DataFrame对象中&#xff0c;我现在想对这两个数据集进行统计特征分析&#xff0c;并用直方图展示出来。 2.代码…

CSS学习(3)-浮动和定位

一、浮动 1. 元素浮动后的特点 脱离文档流。不管浮动前是什么元素&#xff0c;浮动后&#xff1a;默认宽与高都是被内容撑开&#xff08;尽可能小&#xff09;&#xff0c;而且可以设置宽 高。不会独占一行&#xff0c;可以与其他元素共用一行。不会 margin 合并&#xff0c;…

护眼大路灯好不好用?中国路灯排行榜

护眼大路灯好不好用&#xff1f;关于这个问题一直有争议&#xff0c;一部分人觉得大路灯不好用&#xff0c;而且会增加支出&#xff0c;绝大多数人则认为大路灯特别好用&#xff0c;之所以会有不同的看法&#xff0c;小编觉得&#xff0c;还是大家使用的大路灯不同&#xff0c;…

[C语言]——函数递归

目录 一.什么是递归 1.递归的思想&#xff1a; 二.递归的限制条件 三.递归举例 1.举例1&#xff1a;求n的阶乘 1.1分析和代码实现 1.2画图推演 2.举例2&#xff1a;顺序打印⼀个整数的每⼀位 2.1分析和代码实现 2.2画图推演 四.递归与迭代 1.举例3&#xff1a;求第…

分页多线程处理大批量数据

1.业务场景 因为需要从一个返利明细表中获取大量的数据&#xff0c;生成返利报告&#xff0c;耗时相对较久&#xff0c;作为后台任务执行。但是后台任务如果不用多线程处理&#xff0c;也会要很长时间才能处理完。 另外考虑到数据量大&#xff0c;不能一次查询所有数据在内存…