C语言-----数据在内存中的存储(1)
1.整数在内存中的存储
我们之前就了解过整数的二进制写法分别有3种,分别为原码,反码,补码。整型在内存中存储的是补码。
原码,反码,补码都有自己的符号位和数值位,符号位为1时,则表示负数,符号位为0时,则表示正数。
注意:
正数的原码,反码,补码相同。
而负数的原码,反码,补码是不一样的。
负数的原码就是将其数字转换为二进制,得到原码。
对原码除符号位外的数值位进行取反,得到反码。
反码+1 得到补码。
以上是有负数的原码得到其补码的过程。
由负数的补码得到原码也可以通过 对补码进行取反加1得到其原码。
2.大小端字节序和字节序判断
我们先看一段简单的代码
如下图
变量a原本设置的是0x11223344,可通过vs编译器调试发现,其在内存中的存储顺序恰好是反过来的。
这是为什么呢?
这就涉及到来大小端字节序的问题。
2.1 大小端的含义
首先我们要清楚当储存的数据大小超过一个字节时,其在内存中的存储顺序就有了大端字节序存储和小端字节序存储。
1.大端字节序存储:是指数据的低字节内容保存在内存中的高地址处,而高细节内容保存在内存中的低地址处。
如图,11相对于22来说,11是高字节内容,22是低字节内容。
所以将11放在低地址处,22放在放在高地址处。33和44依此类推。
2. 小端字节序存储:是指数据的低字节内容保存在内存中的低地址,而高字节内容保存在内存中的·高地址处。
如图
通过以上了解的内容可知,为什么数据在vs中调试,在内存中的存储顺序是倒过来的。
原因是vs是小端字节序存储。
2.2 判断大小端字节序
虽然我们知道了vs是小端字节序存储,那我们如何来证明呢?
我们可以通过代码来实现
int system()
{int a = 1;char* p = &a;return *p;
}
int main()
{int ret = system();if (ret == 1){printf("小端字节序存储");}else{printf("大端字节序存储");}return 0;
}
看图
如上图所示,a的16进制位分别在大端字节序和小端字节序的顺序排序。
我们又设计了一个char* p指针来存储a,所以p指向了a的第一个字节的内容,当我们对p进行解引用时,一次也只能访问一个字节,而一个字节恰好是2个16进制位。
返回*p的值,用ret来保存*p,我们就可以通过ret的值来判断大小端字节序存储了。
当返回值位1时,是小端字节序存储,返回值位0时,是大端字节序存储。
用vs运行代码
3.练习题
接着来几道练习题巩固一下知识。
练习1
#include <stdio.h>
int main()
{char a= -1;signed char b=-1;unsigned char c=-1;printf("a=%d,b=%d,c=%d",a,b,c);return 0;
}
我们一开始看到该题可能会有点蒙,不过别慌张,我们分析下代码。
该题创建了 a,b,c 三个变量,分别是char ,signed char, unsigned char 类型。
这时很疑惑,明明是 -1 是个整型数据,却用了一个不符合整型类型的变量来存储。
但这是允许的。只不过会发生数据的截断,影响最终打印的结果。
这种题思路是一样的。
我们先以a为例
我们先把 -1 的原码写出来,为1000000000000000000000000001,
在对其取反,为 11111111111111111111111111111110,得到反码。
在对反码加1得到补码,为11111111111111111111111111111111,便是-1的补码。
我们知道整型数据在内存中是以补码的形式存储的,但是由于变量a是char类型的,所以a只能存储一个字节大小的数据,也就是8个比特位。则会发生数据的截断。
优先截断低字节的数据,这时便会截断8个比特位的内容存储到a中。
则这时a中存储的是11111111
(补充:char类型是signed类型的还是unsigned类型的是取决于编译器的,再vs中char默认为是signed char 类型的。)
最后我们要以整型打印,所以要对a进行整型提升。
(整型提升规则:有符号数据补符号位,无符号数据不0)
由于a是signed char 型,属于有符号型,则对a进行整型提升后为:
11111111111111111111111111111111
整型提升后得到的还是补码。所以我们要求出其原码。
接着对补码进行取反+1的操作的到原码:
10000000000000000000000000000001
由于是以%d的形式打印,也就是将a看作有符号数据,所以此时的最高位为符号位。
通过原码计算可知,最终a的值为 -1。
接着来分析b
由于b的类型和a在vs中的数据类型是一样的,并且赋值都为-1,所以和以上a的推算是一模一样的。
最后来分析c
一样的步骤,把 -1 的原码写出来 , 为 1000000000000000000000000001(原码)
接着对原码取反,为 11111111111111111111111111111110 (反码)
反码加1得到补码,为 11111111111111111111111111111111(补码)
也由于 c 是unsigned char 类型的,只能存储一个字节大小的数据,也就是8个比特位。
则发生截断
这时c存储的是11111111。
接着对其进行整型提升,由于c是unsigned char 类型,则此时最高位不是符号位了,所以补0.
得到 00000000000000000000000011111111 ,此时得到的也是补码。
但由于c是无符号数据,则原码,反码,补码,相同。
通过原码计算得 c为255。
运行代码
练习2
#include <stdio.h>
int main()
{char a[1000];int i;for(i=0; i<1000; i++)
{a[i] = -1-i;}printf("%d",strlen(a));return 0;
}
一开始看到这道题,是肯定会懵一下的。不过别慌张,冷静分析。
这里涉及到一个循环,后面有涉及到了一个strlen的计算,我们知道strlen计算的是 '/0' 之前的长度。而 \0 的ASCII值为0,所以计算的是0之前的长度。
遇到这种题,有一个圆形图解法。下面是char 的圆图。
如上图,我们对二进制的+1弄成一个圆,也就是循环了。
由于题目是减1,那就反过来,则0的前面就有255个,则长度就为255.
运行代码,如下图,也是255.
练习3
#include <stdio.h>
unsigned char i = 0;
int main()
{for(i = 0;i<=255;i++){printf("hello world\n");}return 0;
}
这也可以根据圆形图解法来解决,不过是unsigned char 类型的圆
由此得出 i 的 取值范围 0~255,所以 i 永远小于等于255,则循环条件恒成立,这样就会现如死循环。
练习4
#include <stdio.h>
int main()
{int a[4] = { 1, 2, 3, 4 };int *ptr1 = (int *)(&a + 1);int *ptr2 = (int *)((int)a + 1);printf("%x,%x", ptr1[-1], *ptr2);return 0;
}
这道题是有点复杂的,我们还是冷静分析。
线分析ptr1,如下图
由上图轻易得到ptr[-1]为4。
难点就在ptr2
我们知道数组名在大部分就是条件下是首元素地址,所以此时a是首元素地址 ,但是被强制转换成int 类型了,强制转换成 int 型后进行加1,我们知道整型加1和整数加1的道理差不多,这时加1就是跳过了1个字节。我们将数组的内容转换成16进制的形式。
上面分析得知,整型加1就是跳过一个字节,而2个16进制位就是一个字节。而a中又是int类型的,存了4个字节的数据。如下图所示
但又因为在vs中是小端字节序存储,所以我们要将ptr2还原。
还原得到 02000000。
运行代码,如下图
相关文章:
C语言-----数据在内存中的存储(1)
1.整数在内存中的存储 我们之前就了解过整数的二进制写法分别有3种,分别为原码,反码,补码。整型在内存中存储的是补码。 原码,反码,补码都有自己的符号位和数值位,符号位为1时,则表示负数&…...
Ribbon有哪些负载均衡策略
负载均衡类都实现了IRule接口。 RandomRule:随机的选用一个实例 RoundRobinRule:轮询的使用实例 RetryRule:在轮询的基础上加了一个错误重试机制,在deadline时间内会不断的重试 WeightResponeTimeRule:根据权重去做…...
websocket多级nginx代理
在使用多层Nginx代理时,WebSocket的连接可能会遇到一些问题,因为WebSocket连接是持久化的,它需要Upgrade头部来确认升级到WebSocket协议。在多层代理的情况下,每层代理可能会修改或丢失这个Upgrade头部信息。 为了确保WebSocket能…...
【python从入门到精通】-- 第四战:语句汇总
🌈 个人主页:白子寰 🔥 分类专栏:python从入门到精通,魔法指针,进阶C,C语言,C语言题集,C语言实现游戏👈 希望得到您的订阅和支持~ 💡 坚持创作博文…...
【NC50937】货仓选址
题目 货仓选址 二分,前缀和,数学推导 思路 由题意可知货仓的位置是可以和商店的位置重合的。首先应该将商店的坐标从小到大排序,然后假设商店的坐标为 a i a_i ai,货仓的坐标为 x x x,货仓左侧第一家商店&#x…...
Nginx配置使用笔记
Nginx配置使用笔记 前言 官网下载压缩包https://nginx.org/ 解压完成后当前目录cmd输入nginx指令启动 访问http://localhost:80确认启动成功 1.部署前端项目 部署前端项目到路径E:\Workspaces\Vscode\app-web 2.0配置nginx.conf文件 在nginx安装的conf目录下新建一个文件夹l…...
GridLayoutManager 中的一些坑
前言 如果GridLayoutManager使用item的布局都是wrap_cotent 那么会在布局更改时会出现一些出人意料的情况。(本文完全不具备可读性和说教性,仅为博主方便查找问题) 布局item: <!--layout_item.xml--> <?xml version"1.0&qu…...
算法实验二 矩阵最小路径和 LIS
算法实验课二 矩阵最小路径和 leetcode裸题 最小路径和 给定一个包含非负整数的 *m* x *n* 网格 grid ,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。 说明:每次只能向下或者向右移动一步。 示例 1: 输入&…...
Apache Paimon实时数据糊介绍
Apache Paimon 是一种湖格式,可以使用 Flink 和 Spark 构建实时 数据糊 架构,用于流式和批处理操作。Paimon 创新地将湖格式和 LSM(日志结构合并树)结构相结合,将实时流式更新引入湖架构中。 Paimon 提供以下核心功能: 实时更新: 主键表支持大规模更新的写入,具有非常…...
计算机网络:数据链路层 - 可靠传输协议
计算机网络:数据链路层 - 可靠传输协议 可靠传输概念停止-等待协议 SW回退N帧协议 GBN选择重传协议 SR 可靠传输概念 如下所示,帧在传输过程中受到干扰,产生了误码。接收方的数据链路层,通过真伪中的真检验序列 FCS 字段的值&…...
苍穹外卖07(缓存菜品,SpringCache,缓存套餐,添加购物车菜品和套餐多下单,查看购物车,清除购物车,删除购物车中一个商品)
目录 一、缓存菜品 1 问题说明 2 实现思路 3 代码开发:修改DishServiceImpl 4 功能测试 二、SpringCache 1. 介绍 2. 使用语法 1 起步依赖 2 使用要求 3 常用注解 4 SpEL表达式(了解备用) 5 步骤小结 3.入门案例 1 准备环境 2 使用入门 1 引导类上加…...
C语言第三十八弹---编译和链接
✨个人主页: 熬夜学编程的小林 💗系列专栏: 【C语言详解】 【数据结构详解】 编译和链接 1、翻译环境和运行环境 2、翻译环境 2.1、预处理(预编译) 2.2、编译 2.2.1、词法分析 2.2.2、语法分析 2.2.3、语义分…...
无人售货奶柜:开启便捷生活的新篇章
无人售货奶柜:开启便捷生活的新篇章 在这个快节奏的现代生活中,科技的革新不仅为我们带来了前所未有的便利,更在不经意间改变着我们的日常。其中,无人售货技术的出现,尤其是无人售货奶柜,已经成为我们生活…...
STM32为什么不能跑Linux?
STM32是一系列基于ARM Cortex-M微控制器的产品,它们主要用于嵌入式系统中。而Linux则是一个开源的类Unix操作系统,主要面向的是桌面电脑、服务器等资源丰富的计算机。虽然理论上可以将Linux移植到STM32上运行,但是由于两者之间存在着很多技术…...
Dubbo 3.x源码(18)—Dubbo服务引用源码(1)
基于Dubbo 3.1,详细介绍了Dubbo服务的发布与引用的源码。 此前我们学习了Dubbo的服务导出的源码,在DubboBootstrapApplicationListener#startSync方法中,在调用了exportServices方法进行服务导出之后,立即调用了referServices方法…...
设计模式:工厂模式和抽象工厂模式的区别
定义 工厂模式(Factory Pattern)通常指的是工厂方法模式(Factory Method Pattern),它定义了一个创建对象的方法,由子类决定要实例化的类。工厂方法让类的实例化推迟到子类。 抽象工厂模式(Abstract Factory Pattern)提供了一个接口,用于创建相关或依赖对象的家族,而…...
python面试题(36~50)
36、如何取一个整数的绝对值? 这可以通过abs函数来实现。 abs(2) #> 2 abs(-2) #> 2 37、如何将两个列表组合成一个元组列表? 可以使用zip函数将列表组合成一个元组列表。这不仅仅限于使用两个列表。也适合3个或更多列表的情况。 a [a,b,c] b [1,2,3] [(k,v) fo…...
Vue 样式技巧总结与整理[中级局]
SFC(单文件组件)由 3 个不同的实体组成:模板、脚本和样式。三者都很重要,但后者往往被忽视,即使它可能变得复杂,且经常导致挫折和 bug。 更好的理解可以改善代码审查并减少调试时间。 这里有 7 个奇技淫巧…...
cesium加载.tif格式文件
最近项目中有需要直接加载三方给的后缀名tif格式的文件 <script src"https://cdn.jsdelivr.net/npm/geotiff"></script> 或者 yarn add geotiff npm install geotiff 新建tifs.js import GeoTIFF, { fromBlob, fromUrl, fromArrayBuffer } from geotif…...
分布式全闪占比剧增 152%,2023 年企业存储市场报告发布
近日,IDC 发布了 2023 年度的中国存储市场报告。根据该报告,在 2023 年软件定义存储的市场占比进一步扩大,分布式全闪的增长尤其亮眼,其市场份额从 2022 年的 7% 剧增到 2023 年的 17.7%,增长了 152%。 01 中国企业存…...
LeetCode 707. 设计链表(单链表、(非循环)双链表 模板)
你可以选择使用单链表或者双链表,设计并实现自己的链表。 单链表中的节点应该具备两个属性:val 和 next 。val 是当前节点的值,next 是指向下一个节点的指针/引用。 如果是双向链表,则还需要属性 prev 以指示链表中的上一个节点…...
深入了解Flutter中Overlay的介绍以及使用
Flutter Overlay 介绍 在 Flutter 中,Overlay 是一种特殊的 Widget,它可以用来在应用程序的其他部分之上显示内容。Overlay 非常适合用于显示模态对话框、弹出菜单、工具提示等。 Overlay 的工作原理 Overlay 位于 Flutter 的渲染树之外,这…...
文本直接生成2分钟视频,即将开源模型StreamingT2V
Picsart人工智能研究所、德克萨斯大学和SHI实验室的研究人员联合推出了StreamingT2V视频模型。通过文本就能直接生成2分钟、1分钟等不同时间,动作一致、连贯、没有卡顿的高质量视频。 虽然StreamingT2V在视频质量、多元化等还无法与Sora媲美,但在高速运…...
时序预测 | Matlab实现SOM-BP自组织映射结合BP神经网络时间序列预测
时序预测 | Matlab实现SOM-BP自组织映射结合BP神经网络时间序列预测 目录 时序预测 | Matlab实现SOM-BP自组织映射结合BP神经网络时间序列预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 1.Matlab实现SOM-BP自组织映射结合BP神经网络时间序列预测(完整源码…...
FPGA高端图像处理开发板-->鲲叔4EV:12G-SDI、4K HDMI2.0、MIPI等接口谁敢与我争锋?
目录 前言鲲叔4EV----高端FPGA图像处理开发板核心板描述底板描述配套例程源码描述配套服务描述开发板测试视频演示开发板获取 前言 在CSDN写博客传播FPGA开发经验已经一年多了,帮助了不少人,也得罪了不少人,有的人用我的代码赢得了某些比赛、…...
linux练习-交互式传参
在shell脚本中,read 向用户显示一行文本并接受用户输入 #!/bin/bash read -p 依次输入你的姓名、年龄、家乡 name age home echo 我是$name,年龄$age,我来自$home...
【数据结构(一)】初识数据结构
❣博主主页: 33的博客❣ ▶文章专栏分类: Java从入门到精通◀ 🚚我的代码仓库: 33的代码仓库🚚 🫵🫵🫵关注我带你学更多数据结构知识 目录 1.前言2.集合架构3.时间和空间复杂度3.1算法效率3.2时间复杂度3.2.1大O的渐进…...
前端三剑客 —— CSS (第六节)
目录 内容回顾: 弹性布局属性介绍 案例演示 商品案例 布局分析 登录案例 网格布局 内容回顾: 变量:定义变量使用 --名称:值; 使用变量: 属性名:var(--名称)&a…...
MyBatis 解决上篇的参数绑定问题以及XML方式交互
前言 上文:MyBatis 初识简单操作-CSDN博客 上篇文章我们谈到的Spring中如何使用注解对Mysql进行交互 但是我们发现我们返回出来的数据明显有问题 我们发现后面三个字段的信息明显没有展示出来 下面我们来谈谈解决方案 解决方案 这里的原因本质上是因为mysql中和对象中的字段属性…...
Rust语言之属性宏(Attribute Macro)derive
文章目录 Rust语言之属性宏(Attribute Macro)derive Rust语言之属性宏(Attribute Macro)derive 属性宏是一种基于属性的宏,用于修改、扩展或注解 Rust 代码。它们通常用于为函数、结构体、枚举、模块等添加元数据或自…...
绍兴公司做网站/附近电脑培训班零基础
H5是JS封装的工具集合,通过H5我们就可以使用JS的方式去调用到我们手机端上的一些原生的组件。 http://dev.dcloud.net.cn/mui/ http://dev.dcloud.net.cn/mui/ui/ 开发过微信小程序或者说Bootstrap,那么使用起来是非常的简单和方便。 http://ask.dcloud.…...
dw做网站小技巧/免费网络推广软件
Educational Codeforces Round 110 (Rated for Div. 2) A. Fair Playoff 题目入口 思路 找出最大和次大模拟即可 代码 #include<bits/stdc.h> using namespace std; int a[5]; int main() {int t;cin>>t;while(t--){int maxx-1,max2-1;for(int i1;i<4;i){c…...
dw可以制作网站吗/如何在网上推广自己的公司
为什么80%的码农都做不了架构师?>>> 此示例演示DirectEvent中定义的事件Before、After、Success、Failure、Complete执行顺序 这些事件是JS方法定义。以此执行的顺序是:1、Before 2、After 3、有异常或操作不成功Failure否则Success 4、Comp…...
伍佰亿门户网站/谷歌浏览器 官网下载
大致思路:将数据从数据库中查询出来,显示到页面上,形成列表 查询需要一个结果集:ResultSet rs null; 想要查询,需要遍历 信息查询业务处理 梳理: 1.编写查询页面 2.在servlet接收查询条件信息 3.在DAO中处…...
长沙手机网站建设哪些内容/seo收录查询工具
第1章作业: 1.简述你是如何理解数据库系统的三级模式(模式、外模式、内模式)之间的关系的。 答:.数据库的三级模式是数据库在三个级别上的抽象,用户级对应外模式,概念级对应概念模式,物理级对…...
做旅游网站需要引进哪些技术人才/网络营销题库案例题
Zuul是spring cloud中的微服务网关。网关:是一个网络整体系统中的前置门户入口。请求首先通过网关,进行路径的路由,定位到具体的服务节点上。Zuul是一个微服务网关,首先是一个微服务。也是会在Eureka注册中心中进行服务的注册和发…...