当前位置: 首页 > news >正文

数据在内存的存储

整数在内存中的存储

       我们来回顾一下,整数在计算机是以补码的形式进行存储的,整数分为正整数和负整数,正整数的原码、反码和补码是一样的,负整数的原码、反码和补码略有不同(反码是原码除符号位,其他位按位取反(即0变成1,1变成0),补码就是反码+1),负整数的补码变为原码也是一样的,保留符号位,其他位按位取反,再+1就可以得到原码。
       在计算机储存数据的时候,会有一个符号位(最开头的数位用1来表示负数,用0来表示正数)来表示正负,剩下的是数值位来表示数值。正数的原码、反码和补码是完全一样的,这里注意符号位是不会变的,负数的反码就是除了原码的符号位不变之外,其他位按位取反(就是0变成1,1变成0),补码就是在反码的基础上加1
这里我们以32位机器来举例:

大小端字节序

       我们来引入一个例子

大家是不是看到存储的数据是倒过来的,当数据超过一个字节的时候就会出现字节存储的顺序问题,这就是大小端字节序存储的问题。

解释

大端字节序就是数据的高位存到低地址处,低位存到高地址处。
小端字节序就是数据的低位存到低地址处,高位存到高地址处。

我们以从左到右是从低地址到高地址进行增加为例:

由此可见,开始我们引入的例子是按小端存储的,我是用VS2022来演示的。

练习

问题一

设计代码来判断当前机器的字节序

我们可以使用一个数字来进行判断,这里我使用数字1,数字1的十六进制表示为0x00000001,我们只要拿出第一个字节就可以判断大小端存储了,如果拿出的是0,就是大端字节序存储,如果拿出的是1,那就是小端字节序存储。

#include <stdio.h>int check_sys()
{int i = 1;return (*(char*)&i);
}int main()
{int ret = check_sys();if (ret == 1){printf("⼩端\n");}else{printf("⼤端\n");}return 0;
}

代码分析题

代码一
#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;
}

我们来分析一下这段代码,首先char有没有符号取决于编译器的,我这里使用的是VS2022,char是有符号的,所以a和b 就会打印-1,但是c 就不一样,首先-1在内存中的原码是10000001,反码是11111110,补码是11111111,由于 c 是无符号的,所以在内存中的11111111的第一个1就不会解读为符号位,而是正常的数位,所以打印255。

来看一下运行结果:

代码二
#include <stdio.h>int main()
{char a = -128;printf("%u\n", a);return 0;
}

首先 -128 写出二进制为1000 0000 0000 0000 0000 0000 1000 0000,反码为1111 1111 1111 1111 1111 1111 0111 1111,补码为1111 1111 1111 1111 1111 1111 1000 0000,由于是char 类型,所以发生截断,以八个比特位来进行保存,就是1000 0000,以%u的形式打印,%u是无符号的整型(就是unsigned int 类型),所以发生整型提升,就变成1111 1111 1111 1111 1111 1111 1000 0000,这个数字我们拿计算机算一下,就会得出

来看一下运行结果:

代码三
#include <stdio.h>int main()
{char a = 128;printf("%u\n", a);return 0;
}

128 的原码是 0000 0000 0000 0000 0000 0000 1000 0000,由于是整数,所以原码反码补码是一样的。由于是char 类型发生截断,保留八个比特位,就是1000 0000,用%u来进行打印,发生整型提升,由于char 是有符号的,所以提升为1111 1111 1111 1111 1111 1111 1000 0000 ,然后打印,由于是无符号的整数打印,其实结果和上一道题目的结果是一样的。

代码四
#include <stdio.h>
#include <string.h>int main()
{char a[1000];int i;for (i = 0; i < 1000; i++){a[i] = -1 - i;}printf("%d", strlen(a));return 0;
}

这个我们就要思考 char 是有取值范围的,-128~127,一共有256个数字,strlen遇到\0,就会停止计算,这里的a从-1开始存储,当a变为-128时,再减一就会变成127,一直减到0,之后减一变为-1,依次类推形成一个循环结构,就如下图所示,所以,strlen(a)的计算结果应该是0之前的255个数。

来验证一下:

代码五
#include <stdio.h>unsigned char i = 0;int main()
{for (i = 0; i <= 255; i++){printf("hello world\n");}return 0;
}

这个代码还是一样,拿出我们的循环图:

当 i 从 1 开始,加到255时,再加1 就不是256,而是255,所以不会跳出循环,而是一个死循环。

代码六
#include <stdio.h>int main()
{unsigned int i;for (i = 9; i >= 0; i--){printf("%u\n", i);}return 0;
}

这个代码其实不用画循环图也能做,因为unsigned int 是无符号的整数,i 永远大于等于0,所以这还是一个死循环。

代码七
#include <stdio.h>//x86环境,小端字节序存储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:

&a取出的是整个数组的地址,&a+1是跳过整个数组,ptr1[-1] = (ptr+(-1)),由于prt1是int类型的,所以ptr1-1就会往后移动一个int,解引用就是指向 4

ptr2:
由于是小端字节序存储,我们来画一下内存图:

由于a 是数组首元素的地址,所以 a 其实指向 1 ,由于(int) a 强制类型将a转换为int类型,+1后就是a的地址+1,指向01后面的00,由于ptr2是int*类型,搜易解引用就会取出四个字节的数据,也就是0x02 00 00 00

浮点数在内存中的存储

       首先我们要知道浮点数的存储和整数的存储是不一样的,不信的可以看一下下面的运行截图:

现在我们来探讨一下浮点数在内存中是如何存储的:
由于浮点数的存储比较复杂,为了方便大家快速了解,我对此进行了一下总结:
首先,一个公式:(-1)^S * M * 2^ E , 浮点数也是有符号的,所以我们用S(二进制位,所以S只能取 0 或 1)来控制(-1)的0或1次方进而也就控制了浮点数的正负性,然后就是我们将浮点数化成类似科学计数法的形式(在二进制里,我们化成1.xxxx*2^E), 之后我们去掉1留下的来的xxxxx就是M,而E的处理就有点复杂,因为E可能为负数,所以为了避免负数的情况我们将其加上一个中间数(127或者1023)

注意了:浮点数的二进制表示,如0.5,怎么表示小数部分,要注意小数点后面浮点数的二进制权重是从2^ (-1)、 2^ (-2)、2^ (-3)…依次叠加的,所以我们要凑出0.5,也就是1,因为1*2^(-1)就是0.5

我们来看一下32位的float和64位的double存储情形:

E加中间数也是根据浮点数的类型进行加的,32的float加127,64位的double 加1023

正常情况下:

E不为全0或全1,那就是正常处理,减去中间数,取出S得到正负,取出M再加1得到一个1.xxxx,然后通过公式(-1)^S * M * 2^E

特殊情况:

当E位全0:
当E为全0的时候,在float下,E就是-127;在 double 下,E就是-1023,那么2^E就是一个很小的数,接近0

当E为全1:
当E为全1时,E就是一个很大的数,2^E就会使这个浮点数接近无穷大。

现在我们来分析一下开头的例子:

#include <stdio.h>int main()
{int n = 9;float* pFloat = (float*)&n;printf("n的值为:%d\n", n);printf("*pFloat的值为:%f\n", *pFloat);*pFloat = 9.0;printf("num的值为:%d\n", n);printf("*pFloat的值为:%f\n", *pFloat);return 0;
}

9 的原码是0000 0000 0000 0000 0000 0000 0000 1001
32位的float,S是0,E是取八位 0000 0000 ,M是000 0000 0000 0000 0000 1001,由于E为全0,所以浮点数无限接近0。

9.0 用浮点数的公式表示:先算出M来,9.0 转化为二进制 1001.0,变为科学计数法就是1.0010 * 2^3 ,则M 为001,后面凑0,知道凑满23位,E等于3+127=130,化成二进制就是
1000 0010 ,由于是整数,所以符号位取0。

所以在内存中9.0表示为:
0100 0001 0001 0000 0000 0000 0000 0000

由于要进行整数打印,将上面一串二进制直接翻译成整数,拿计算机一算:

结果就是我们打印的结果。

相关文章:

数据在内存的存储

整数在内存中的存储 我们来回顾一下&#xff0c;整数在计算机是以补码的形式进行存储的&#xff0c;整数分为正整数和负整数&#xff0c;正整数的原码、反码和补码是一样的&#xff0c;负整数的原码、反码和补码略有不同&#xff08;反码是原码除符号位&#xff0c;其他位按位取…...

JavaScript之ES中的类继承与Promise

类 ES5中的类及继承 //人function Person(name,age){this.name name;this.age age;}Person.prototype.eat function () {console.log(this.name "eat");}//程序员&#xff0c;继承&#xff0c;人function Programmer(name,age,language){//构造函数继承Person.…...

​浅析多模态大模型技术路线梳理

前段时间 ChatGPT 进行了一轮重大更新&#xff1a;多模态上线&#xff0c;能说话&#xff0c;会看图&#xff01;微软发了一篇长达 166 页的 GPT-4V 测评论文&#xff0c;一时间又带起了一阵多模态的热议&#xff0c;随后像是 LLaVA-1.5、CogVLM、MiniGPT-5 等研究工作紧随其后…...

使用 Amazon SageMaker 微调 Llama 2 模型

本篇文章主要介绍如何使用 Amazon SageMaker 进行 Llama 2 模型微调的示例。 这个示例主要包括: Llama 2 总体介绍Llama 2 微调介绍Llama 2 环境设置Llama 2 微调训练 前言 随着生成式 AI 的热度逐渐升高&#xff0c;国内外各种基座大语言竞相出炉&#xff0c;在其基础上衍生出…...

牛客小白月赛86(D剪纸游戏)

题目链接:D-剪纸游戏_牛客小白月赛86 (nowcoder.com) 题目描述: 输入描述: 输入第一行包含两个空格分隔的整数分别代表 n 和 m。 接下来输入 n行&#xff0c;每行包含 m 个字符&#xff0c;代表残缺纸张。 保证&#xff1a; 1≤n,m≤10001 字符仅有 . 和 * 两种字符&#xf…...

MySQL的基础操作与管理

一.MySQL数据库基本操作知识&#xff1a; 1.SQL语句&#xff1a; 关系型数据库&#xff0c;都是使用SQL语句来管理数据库中的数据。 SQL&#xff0c;即结构化查询语言(Structured Query Language) 。 SQL语句用于维护管理数据库&#xff0c;包括数据查询、数据更新、访问控…...

Pytorch 中的forward 函数内部原理

PyTorch中的forward函数是nn.Module类的一部分&#xff0c;它定义了模型的前向传播规则。当你创建一个继承自nn.Module的类时&#xff0c;你实际上是在定义网络的结构。forward函数是这个结构中最关键的部分&#xff0c;因为它指定了数据如何通过网络流动。 单独设计 forward …...

四、C语言中的数组:如何输入与输出二维数组(数组,完)

本章的学习内容如下 四、C语言中的数组&#xff1a;数组的创建与初始化四、C语言中的数组&#xff1a;数组的输入与元素个数C语言—第6次作业—十道代码题掌握一维数组四、C语言中的数组&#xff1a;二维数组 1.二维数组的输入与输出 当我们输入一维数组时需要一个循环来遍历…...

基于python+vue智慧农业小程序flask-django-php-nodejs

传统智慧农业采取了人工的管理方法&#xff0c;但这种管理方法存在着许多弊端&#xff0c;比如效率低下、安全性低以及信息传输的不准确等&#xff0c;同时由于智慧农业中会形成众多的个人文档和信息系统数据&#xff0c;通过人工方法对知识科普、土壤信息、水质信息、购物商城…...

好用的GPTs:指定主题搜索、爬虫、数据清洗、数据分析自动化

好用的GPTs&#xff1a;指定主题搜索、爬虫、数据清洗、数据分析自动化 Scholar&#xff1a;搜索 YOLO小目标医学方面最新论文Scraper&#xff1a;爬虫自动化数据清洗数据分析 点击 Explore GPTs&#xff1a; Scholar&#xff1a;搜索 YOLO小目标医学方面最新论文 搜索 Scho…...

使用Qt自带windeployqt打包QML的exe

1.在开始菜单输入CMD找到对应的Qt开发版本&#xff0c;我的是Qt5.15.2(MinGW 8.1.0 64-bit)。 2.在控制台输入如下字符串&#xff0c;格式为 windeployqt exe绝对路径 --qmldir 工程的绝对路径 如下是我的打包代码。 我需要打包的exe的绝对路径 D:\Prj\Code\Demo\QML\Ana…...

C代码快速傅里叶变换-分类和推理-常微分和偏微分方程

要点 C代码例程函数计算实现&#xff1a; 线性代数方程解&#xff1a;全旋转高斯-乔丹消元&#xff0c;LU分解前向替换和后向替换&#xff0c;对角矩阵处理&#xff0c;任意矩阵奇异值分解&#xff0c;稀疏线性系统循环三对角系统解&#xff0c;将矩阵从完整存储模式转换为行索…...

计算机组成原理 双端口存储器原理实验

一、实验目的 1、了解双端口静态随机存储器IDT7132的工作特性及使用方法 2、了解半导体存储器怎样存储和读出数据 3、了解双端口存储器怎样并行读写&#xff0c;产生冲突的情况如何 二、实验任务 (1)按图7所示&#xff0c;将有关控制信号和和二进制开关对应接好&#xff0c;…...

[音视频学习笔记]六、自制音视频播放器Part1 -新版本ffmpeg,Qt +VS2022,都什么年代了还在写传统播放器?

前言 参考了雷神的自制播放器项目&#xff0c;100行代码实现最简单的基于FFMPEGSDL的视频播放器&#xff08;SDL1.x&#xff09; 不过老版本的代码参考意义不大了&#xff0c;我现在准备使用Qt VS2022 FFmpeg59重写这部分代码&#xff0c;具体的代码仓库如下&#xff1a; …...

GPT-5可能会在今年夏天作为对ChatGPT的“实质性改进”而到来

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…...

官宣|阿里巴巴捐赠的 Flink CDC 项目正式加入 Apache 基金会

摘要&#xff1a;本文整理自阿里云开源大数据平台徐榜江 (雪尽)&#xff0c;关于阿里巴巴捐赠的 Flink CDC 项目正式加入 Apache 基金会&#xff0c;内容主要分为以下四部分&#xff1a; 1、Flink CDC 新仓库&#xff0c;新流程 2、Flink CDC 新定位&#xff0c;新玩法 3、Flin…...

部署单节点k8s并允许master节点调度pod

安装k8s 需要注意的是k8s1.24 已经弃用dockershim&#xff0c;现在使用docker需要cri-docker插件作为垫片&#xff0c;对接k8s的CRI。 硬件环境&#xff1a; 2c2g 主机环境&#xff1a; CentOS Linux release 7.9.2009 (Core) IP地址&#xff1a; 192.168.44.161 一、 主机配…...

Django日志(三)

内置TimedRotatingFileHandler 按时间自动切分的log文件,文件后缀 %Y-%m-%d_%H-%M-%S , 初始化参数: 注意 发送邮件的邮箱,开启SMTP服务 filename when=h 时间间隔类型,不区分大小写 S:秒 M:分钟 H:小时 D:天 W0-W6:星期几(0 = 星期一) midnight:如果atTime未指定,…...

【吾爱破解】Android初级题(二)的解题思路 _

拿到apk&#xff0c;我们模拟器打开看一下 好好&#xff0c;抽卡模拟器是吧&#x1f600; jadx反编译看一下源码 找到生成flag的地方&#xff0c;大概逻辑就是 java signatureArr getPackageManager().getPackageInfo(getPackageName(), 64).signaturesfor (int i 0; i &l…...

富格林:谨记可信计策安全做单

富格林悉知&#xff0c;现货黄金由于活跃的行情给投资者带来不少的盈利的机会&#xff0c;吸引着众多的投资者进场做单。但在黄金投资市场中一定要掌握可信的投资方法&#xff0c;提前布局好策略&#xff0c;这样才能增加安全获利的机会。不建议直接进入市场做单&#xff0c;因…...

Jvppeteer终极指南:Java开发者如何快速掌握浏览器自动化

Jvppeteer终极指南&#xff1a;Java开发者如何快速掌握浏览器自动化 【免费下载链接】jvppeteer Java API For Chrome and Firefox 项目地址: https://gitcode.com/gh_mirrors/jv/jvppeteer 你是否曾为Java项目中的网页自动化测试、数据抓取或性能分析而烦恼&#xff1f…...

如何快速实现AI到PSD的无损转换?Ai2Psd脚本的终极解决方案

如何快速实现AI到PSD的无损转换&#xff1f;Ai2Psd脚本的终极解决方案 【免费下载链接】ai-to-psd A script for prepare export of vector objects from Adobe Illustrator to Photoshop 项目地址: https://gitcode.com/gh_mirrors/ai/ai-to-psd 在专业设计工作流中&am…...

Vite配置文件中process.env与import.meta.env的边界:从Node.js环境到客户端注入的机制解析

1. 为什么Vite配置文件中只能用process.env&#xff1f; 第一次用Vite做项目时&#xff0c;我在vite.config.js里顺手写了import.meta.env&#xff0c;结果控制台直接报错"import.meta is not defined"。当时就纳闷了&#xff1a;明明在组件里用得好好的&#xff0c…...

WPF布局优化:StackPanel控件间距设置的3种实用方法(附代码示例)

WPF布局优化&#xff1a;StackPanel控件间距设置的3种实用方法&#xff08;附代码示例&#xff09; 在WPF应用开发中&#xff0c;界面布局的精细控制往往是区分普通开发者和专业开发者的关键能力之一。StackPanel作为最基础的布局容器之一&#xff0c;其简单易用的特性让它成为…...

低查重黑科技!AI教材生成工具,快速编写高质量教材不再愁!

教材修改与AI工具的引入 教材的初步草稿终于完成&#xff0c;但在修改和优化的过程中&#xff0c;真是让人感到“疲惫不堪”&#xff01;通读全文&#xff0c;寻找逻辑上的漏洞和知识点的失误&#xff0c;确实耗费时间。调整一个章节的框架&#xff0c;往往会影响到后面的多个…...

AIAgent语音识别不再依赖云端?2026奇点大会宣布边缘侧实时ASR芯片流片成功(功耗<1.2W,词错率提升41.6%)

第一章&#xff1a;2026奇点智能技术大会&#xff1a;AIAgent语音识别 2026奇点智能技术大会(https://ml-summit.org) 实时流式语音识别架构演进 本届大会重点展示了新一代AIAgent语音识别引擎——SonicCore v4.2&#xff0c;其核心突破在于将端到端流式识别延迟压缩至平均12…...

梅丽尔•斯特里普携手安妮•海瑟薇亮相上海《穿普拉达的女王2》璀璨之夜 | 美通社头条

、美通社消息&#xff1a;由二十世纪影业出品的时尚巨制《穿普拉达的女王2》&#xff08;The Devil Wears Prada 2&#xff09;“璀璨之夜”于上海前滩太古里盛大举办。活动当晚星光云集&#xff0c;三度斩获奥斯卡金像奖的梅丽尔•斯特里普&#xff08;米兰达的扮演者&#xf…...

2026国内AI镜像网站全景解析:技术、选型、合规与实战指南

2026年,AI大模型已成为开发者、内容创作者与企业运营的标配生产力工具,但ChatGPT、Gemini、Claude等海外顶尖模型仍面临国内访问壁垒、网络不稳定、支付繁琐等现实问题。在此背景下,国内AI镜像网站凭借“国内直连、一站式聚合、低门槛使用”的核心优势,成为行业刚需,相关关…...

华大HC32F460单片机工程搭建全流程(Keil MDK版,附资源包)

华大HC32F460单片机开发环境搭建实战指南&#xff08;Keil MDK版&#xff09; 第一次接触华大HC32F460系列单片机时&#xff0c;最令人头疼的莫过于工程搭建这个看似简单却暗藏玄机的环节。作为国产32位MCU中的佼佼者&#xff0c;HC32F460凭借其出色的性能和丰富的外设资源&…...

阶段零:AI、机器学习、深度学习之间的关系

AI、机器学习、深度学习&#xff1a;一文讲透三者的关系从零开始&#xff0c;用最直观的方式理解AI核心概念一、一句话说清楚 深度学习 ⊂ 机器学习 ⊂ 人工智能 这三个概念是层层包含的关系&#xff0c;就像俄罗斯套娃一样&#xff1a; 最外层&#xff1a;人工智能&#xff08…...