编程之路,从0开始:数据在内存中的存储
目录
1、整数在内存中的存储
(1)大小端
(2)数据存储读取练习
2、浮点数在内存中的存储
Hello大家好,很高兴我们又见面啦!给生活添点Passion,开始今天的编程之路!
1、整数在内存中的存储
之前我们讲过二进制数的原码、反码和补码。对于整型来说,数据存放内存中其实存放的是二进制补码。
(1)大小端
首先我们来介绍一下什么是大小端:
在内存中存储这两个字节有两种方法:一种是将低序字节存储在起始地址,这称为小端(little-endian)字节序;另一种方法是将高序字节存储在起始地址,这称为大端(big-endian)字节序。
什么意思呢?我们现在定义一个变量,看看她是如何储存在内存中的:

我们可以看到,从左往右依次是44 33 22 11,这和我们定义的11 22 33 44恰好相反,数据的高字节内容保存在高地址处说明在这里我们vs2022是小端存储模式。
那么在读取这个数据的时候,就应该由高地址到低地址这样读取。
现在设计一个程序来判断当前机器的字节序(大端还是小端)
#include "stdio.h"
int check()
{int i = 1;return (*(char*)&i);
}
int main()
{int ret = check();if (ret == 1){printf("小端\n");}elseprintf("大端\n");return 0;
}
现在我们来分析一下这个程序是怎么运行的。

我们取出了i的内存,在函数中,我们取出了他的地址,并强制转化成了char型解引用。我们都知道int型数据占四个字节,char型占一个字节,那我们强制转化之后读取只读取了一个字节,也就是01(先读低地址)。倘若我们读出来是00,不就说明他是00 00 00 01这样的大端储存模式吗?
输出结果:

(2)数据存储读取练习
下面我们来看这道题:
#include "stdio.h"
int main()
{char a = -1;signed char b = -1;unsigned char c = -1;//无符号字符型printf("%d %d %d", a, b, c);return 0;
}

a,b的输出结果没有什么异议,就是正常的读取,但是第三个就离谱起来了,结果居然是255!
别害怕,我们一点点来分析。
首先,我们把-1的补码存入内存中:
11111111 11111111 11111111 11111111
char取一个字节:11111111
因为是无符号整型,高位全都补0:00000000 00000000 00000000 11111111
正数的原码,反码,补码都相同,直接转十进制,打印结果为255。
再看下面这道题:
#include "stdio.h"
int main()
{char a = -128;printf("%u",a);return 0;
}
运行结果:
结果很抽象,但是不要害怕,我们一点点来分析:
首先还是把-128补码存入内存中:
11111111 11111111 11111111 10000000
然后,%u是打印无符号整型的意思,打印的时候要先强制转化为无符号整型,然后取一个字节:
10000000
接着用符号位补全:
11111111 11111111 11111111 10000000
现在系统认为这个数是无符号整数,那么他的原码反码补码都是相同的,所以直接换成十进制打印:
这里我们用计算器算出结果。
总结一下容易出错或不容易弄懂的点:
1、如果一个数是无符号整型,那么补全的时候应该用0补全;如果不是无符号整型,则应该用符号位补全。
2、因为我们是以%d的形式打印,所以我们去一个字节后应该补全,补成四个字节。
2、浮点数在内存中的存储
不知道大家在写代码的时候有没有遇到这种问题:在强制转化整型或者不知道怎么着,浮点数以%f的输出结果为0.000000!这就很莫名其妙。
其实原因就在于,在代码编写的时候有意或无意的将整型转化为了浮点型,由于浮点型与整型的读取规则不同,导致出错。
这里我们简单了解一下浮点数是如何进行储存的。
根据国际标准IEEE(电气和电子工程协会) 754,任意一个二进制浮点数V可以表示成下面的形式:
(-1)^s表示符号位,当s=0,V为正数;当s=1,V为负数。
M表示有效数字,大于等于1,小于2。
2^E表示指数位。
放在内存中(这里以32位为例):

最高的1位存储符号位S,接着的8位存储指数E,剩下的23位存储有效数字M
在六十四位中,E存储位数为11位,剩下的52位存储M。
既然存储和读取规则不同,相信大家很容易就明白为什么强制转化之后结果会不正确了!
今天的内容就分享到这,感兴趣的朋友可以点点关注,三连支持一下,我会持续更新C/C++/算法知识分享,期待我们的下次见面!
相关文章:
编程之路,从0开始:数据在内存中的存储
目录 1、整数在内存中的存储 (1)大小端 (2)数据存储读取练习 2、浮点数在内存中的存储 Hello大家好,很高兴我们又见面啦!给生活添点Passion,开始今天的编程之路! 1、整数在内存中的存储 之…...
二叉树+树的OJ题讲解
求第K层节点个数 思路:走到K1就不走了,一次传回得到的值 #include<stdio.h> #include<stdlib.h> //树的定义 typedef int BTDataType; typedef struct BinaryTreeNode {BTDataType data;struct BinaryTreeNode* left;struct BinaryTreeNode* right; }BTNode;//手…...
信捷PLC转以太网连接电脑方法
信捷XC/XD/XL等系列PLC如何上下载程序?可以选择用捷米特JM-ETH-XJ模块轻松搞定,并不需要编程,即插即用,具体看见以下介绍: 产品介绍 捷米特JM-ETH-XJ是专门为信捷PLC转以太网通讯面设计,可实现工厂设备信息化需求,对…...
释放 PWA 的力量:2024 年的现代Web应用|React + TypeScript 示例
在2024年的Web开发领域,PWA(Progressive Web Apps)已经成为一个不可忽视的技术趋势。这篇文章将探讨PWA的最新发展,并通过实例展示如何构建一个现代PWA应用。 PWA的本质与优势 PWA本质上是一种将Web应用提升到接近原生应用体验的技…...
CVSS4与CVSS3的不同之二
在文章CVSS4与CVSS3的不同-CSDN博客中描述了CVSS3的缺点,以及CVSS4相对CVSS3做了哪些改进和带来了哪些优点。 但是具体CVSS4针对CVSS3做了哪些改动,还没有详细列举出来。 本文主要是针对CVSS4和CVSS的打分的大项和小项进行逐一对比,列出来具体…...
【Pip】如何清理 `pip` 包管理器 —— 完整指南
目录 引言1. 清理 pip 缓存2. 卸载不再需要的包2.1 如何查看已安装的包2.2 如何卸载不需要的包 3. 查看已安装的包及其依赖3.1 查看单个包的依赖3.2 查看所有包的依赖关系3.2 优化包依赖 4. 解决包冲突5. 合并和优化依赖5.1 优化 requirements.txt5.2 删除冗余依赖 6. pip 清理…...
操作数据库
""" 本文件是【连接数据库:通过链和代理查询鲜花信息】章节的配套代码,课程链接:https://juejin.cn/book/7387702347436130304/section/7388065974408183858 您可以点击最上方的“运行“按钮,直接运行该文件&…...
lua-lru缓存算法解析
lua-lru缓存算法解析 主要功能和作用1. 缓存管理:2. 数据存储与访问:3. 迭代器:4. 容量管理: 具体实现细节使用场景使用示例 lua-lru 是 Lua 语言中的一个 LRU(Least Recently Used,最近最少使用࿰…...
Python - 初识Python;Python解释器下载安装;Python IDE(一)
一、初识Python Python 是一种高级编程语言,Python是一种面向对象的解释型计算机程序设计语言,Python由荷兰国家数学与计算机科学研究中心的吉多范罗苏姆()Guido van Rossum吉多范罗苏姆()于1989 年底发明…...
鸿蒙学习基本概念
文章目录 1、当前移动应用开发中遇到的主要挑战包括:2、 新的应用生态应该具备如下特征:3、HarmonyOS 应用:使用 HarmonyOS SDK 开发的应用程序,能够在华为终端设备4、HarmonyOS 元服务:元服务是 HarmonyOS 面向万物互…...
正则表达式(补充)
定义一个正则表达式 const 变量名 /表达式/ const reg /前端/ 匹配看字符串中有无前端俩字 正则对象上的一些方法 test() 用于查看正则表达式与指定的字符串是否匹配 const reg /前端/ const res reg.test(学前端,找黑马) //匹配到返回true,匹配不到返回fa…...
第23课-C++-红黑树的插入与旋转
🌇前言 红黑树是一种自平衡的二叉搜索树,因其出色的性能,广泛应用于实际中。Linux 内核中的 CFS 调度器便是一个使用红黑树的例子,这足以说明它的重要性。红黑树的实现通过红黑两种颜色的控制来维持平衡,并在必要时使…...
【C#】C#编程入门指南:构建你的.NET开发基础
文章目录 前言:1. C# 开发环境 VS的基本熟悉2. 解决方案与项目的关系3. 编辑、编译、链接、运行4. 托管代码和CLR4.1 CLR:4.2 C# 代码第编译过程(两次编译的) 5. 命名空间6. 类的组成与分析7. C# 的数据类型7.1 值类型7.2 引用类型…...
[系统安全] PE文件知识在免杀中的应用
0x1 PE文件与免杀思路 基于PE文件结构知识的免杀技术主要用于对抗启发式扫描。 通过修改PE文件中的一些关键点来达到欺骗反病毒软件的目的。 修改区段名 1.1 移动PE文件头位置免杀 工具:PeClean SizeOfOptionalHeader字段来描述扩展头的大小,恒定值为…...
相机标定原理
相机标定原理 什么是相机标定相机畸变 什么是相机标定 为了确定空间物体表面某点的三维几何位置与其在图像中对应点之间的相互关系,需建立相机成像的几何模型,几何模型参数即为相机参数,求解相机参数的过程就是相机标定。 坐标系 **世界坐标…...
Linux基础开发工具使用
目录 1. 软件包管理器yum 1.1 概念介绍 1.2 更换镜像源(可选) 1.3 工具的搜索/查看/安装/卸载 1.4 优势 2. vim编辑器 2.1 vi和vim 2.2 三种常用模式和操作 2.3 配置vim 3. Linux编译器-gcc/g 4. Linux调试器-gdb 5. make和Makefile 6.…...
蓝牙PBAP协议及Android实现
文章目录 前言一、什么是PBAP协议?PBAP的关键功能 二、PBAP的工作流程PBAP流程 三、PBAP在Android实现关键步骤:1. 检查设备是否支持 PBAP 服务 2. 创建 PBAP 连接3. 发送 OBEX 请求4. 解析 vCard 数据数据存储与展示6. 性能优化建议7. 完整示例…...
Py之pymupdf:基于langchain框架结合pymupdf库实现输出每个PDF页面的文本内容、元数据等
Py之pymupdf:基于langchain框架结合pymupdf库实现输出每个PDF页面的文本内容、元数据等 目录 PyMuPDFLoader类 初始化 属性 方法 __init__(file_path, *, headers=None, extract_images=False, **kwargs) lazy_load() aload() alazy_load() load(**kwargs) load_and…...
LeetCode题解:17.电话号码的数字组合【Python题解超详细,回溯法、多叉树】,知识拓展:深度优先搜索与广度优先搜索
题目描述 给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。 示例 1: 输入:digits "23" 输出…...
《JVM第10课》内存溢出(OOM)排查过程
文章目录 常用命令1. jps2. jconsole3. jstat4. jmap 工具1.jvisualvm 排查OOM的方法其实很简单很简单。 如果能找到拋OOM的日志,可以在日志里看到是哪一行抛出的OOM异常。如果找不到日志,那么处理方式是导出Java进程的内存快照,然后用工具查…...
基于FPGA的PID算法学习———实现PID比例控制算法
基于FPGA的PID算法学习 前言一、PID算法分析二、PID仿真分析1. PID代码2.PI代码3.P代码4.顶层5.测试文件6.仿真波形 总结 前言 学习内容:参考网站: PID算法控制 PID即:Proportional(比例)、Integral(积分&…...
前端倒计时误差!
提示:记录工作中遇到的需求及解决办法 文章目录 前言一、误差从何而来?二、五大解决方案1. 动态校准法(基础版)2. Web Worker 计时3. 服务器时间同步4. Performance API 高精度计时5. 页面可见性API优化三、生产环境最佳实践四、终极解决方案架构前言 前几天听说公司某个项…...
高频面试之3Zookeeper
高频面试之3Zookeeper 文章目录 高频面试之3Zookeeper3.1 常用命令3.2 选举机制3.3 Zookeeper符合法则中哪两个?3.4 Zookeeper脑裂3.5 Zookeeper用来干嘛了 3.1 常用命令 ls、get、create、delete、deleteall3.2 选举机制 半数机制(过半机制࿰…...
Python爬虫(一):爬虫伪装
一、网站防爬机制概述 在当今互联网环境中,具有一定规模或盈利性质的网站几乎都实施了各种防爬措施。这些措施主要分为两大类: 身份验证机制:直接将未经授权的爬虫阻挡在外反爬技术体系:通过各种技术手段增加爬虫获取数据的难度…...
【Web 进阶篇】优雅的接口设计:统一响应、全局异常处理与参数校验
系列回顾: 在上一篇中,我们成功地为应用集成了数据库,并使用 Spring Data JPA 实现了基本的 CRUD API。我们的应用现在能“记忆”数据了!但是,如果你仔细审视那些 API,会发现它们还很“粗糙”:有…...
拉力测试cuda pytorch 把 4070显卡拉满
import torch import timedef stress_test_gpu(matrix_size16384, duration300):"""对GPU进行压力测试,通过持续的矩阵乘法来最大化GPU利用率参数:matrix_size: 矩阵维度大小,增大可提高计算复杂度duration: 测试持续时间(秒&…...
ip子接口配置及删除
配置永久生效的子接口,2个IP 都可以登录你这一台服务器。重启不失效。 永久的 [应用] vi /etc/sysconfig/network-scripts/ifcfg-eth0修改文件内内容 TYPE"Ethernet" BOOTPROTO"none" NAME"eth0" DEVICE"eth0" ONBOOT&q…...
AI,如何重构理解、匹配与决策?
AI 时代,我们如何理解消费? 作者|王彬 封面|Unplash 人们通过信息理解世界。 曾几何时,PC 与移动互联网重塑了人们的购物路径:信息变得唾手可得,商品决策变得高度依赖内容。 但 AI 时代的来…...
如何应对敏捷转型中的团队阻力
应对敏捷转型中的团队阻力需要明确沟通敏捷转型目的、提升团队参与感、提供充分的培训与支持、逐步推进敏捷实践、建立清晰的奖励和反馈机制。其中,明确沟通敏捷转型目的尤为关键,团队成员只有清晰理解转型背后的原因和利益,才能降低对变化的…...
Python学习(8) ----- Python的类与对象
Python 中的类(Class)与对象(Object)是面向对象编程(OOP)的核心。我们可以通过“类是模板,对象是实例”来理解它们的关系。 🧱 一句话理解: 类就像“图纸”,对…...
