news 2026/2/2 12:13:42

数据在内存中的存储

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
数据在内存中的存储

1.整数在内存中的存储

我们知道整数的2进制表⽰⽅法有三种,即原码、反码和补码,有符号的整数,三种表⽰⽅法均有符号位和数值位两部分,符号位都是⽤0表⽰“正”1表 ⽰“负,最⾼位的⼀位是被当做符号位,剩余的都是数值位。

正整数的原、反、补码都相同。 负整数的三种表⽰⽅法各不相同。

原码:直接将数值按照正负数的形式翻译成⼆进制得到的就是原码。

反码:将原码的符号位不变,其他位依次按位取反就可以得到反码。

补码:反码+1就得到补码。

对于整形来说:数据存放内存中其实存放的是⼆进制的补码,其原因在于,使用补码可以将符号位与数值位统一处理,同时,加减法也可以统一处理(CPU只有加法器),此外,补码与原码相互转换,其运算过程也是相同的,这样就不需要额外的硬件电路。

2.大小端字节序和字节序判断

当我们了解了整数在内存中的存储后,我们观察一个细节

int main() { int a = 0x11223344; //在内存中观察到,是以44 33 22 11 的形式存储的,即低位字节内容存储到低地址,高位字节内容存储到高地址 // 是为什么呢 //即涉及到存储顺序 return 0; }

其实超过⼀个字节的数据在内存中存储的时候,就有存储顺序的问题,按照不同的存储顺序,我们分 为⼤端字节序存储⼩端字节序存储

下⾯是具体的概念:

⼤端(存储)模式: 是指数据的低位字节内容保存在内存的⾼地址处,⽽数据的⾼位字节内容,保存在内存的低地址处

⼩端(存储)模式: 是指数据的低位字节内容保存在内存的低地址处,⽽数据的⾼位字节内容,保存在内存的⾼地址处。 上述概念需要记住,⽅便分辨⼤⼩端。

2.1设计一个程序来判断当前机器的字节序

int check_sys()//判断字节序 { //if (*(char*)&n == 1) // return 1; //else //{ // return 0; //}//可读性高 int i = 1; //分析,如果是小端字节序,那么1在内存中应该是 01 00 00 00 //如果是大端字节序,那么在内存中应该是 00 00 00 01 //那么我们就可以取内存中第一个字节的地址,解引用通过判断得到的数是0或者1来判断当前的字节序 return (*(char*)&i);//优化版本,可读性低 } int main() { int ret = check_sys(); if (ret == 1) printf("小端字节序\n"); else printf("大端字节序\n"); return 0; }

2.2练习(考察数据在内存中的存储)

整型提升的运用

练习1.

int main() { char a = -1; signed char b = -1; unsigned char c = -1; printf("a = %d, b = %d, c = %d", a, b, c);// -1 ,-1 , 255 return 0; }

题解
首先-1的原码: 10000000000000000000000000000001
反码 : 11111111111111111111111111111110
补码 : 11111111111111111111111111111111
当-1赋给变量a时,会发生截断;得到 11111111 --即在内存中存储的形式
同理,b,c也是如此,我们可以发现,当数据类型相同时,这里指都是char类型时
不论是有符号数还是无符号数,得到的都是 11111111

而%d是以十进制的有符号整数形式打印的
所以a,b,c都要整型提升,,最关键的是,整形提升时就需用到是否为有符号数或无符号数;
由于a和b都是有符号字符,所以整型提升是以符号位补充高位的--

即 11111111111111111111111111111111 ----转为原码为10000000000000000000000000000001 --即-1

而c是无符号数,所以整数提升,是高位补0;
即000000000000000000000000011111111;而打印是是把他当作有符号数打印 即 255。

练习2.

int main() { char a = -128; printf("%u\n", a);//以十进制数的无符号形式打印 return 0; }

题解

-128的原码
10000000000000000000000010000000
反码
11111111111111111111111101111111
补码
11111111111111111111111110000000
存入a时,发生截断,在内存中以 10000000形式存储
打印时由于a是有符号数,故整型提升时,高位补充符号位
即111111111111111111111111000000
由于以十进制数的无符号形式打印,故111111111111111111111111000000会被当成无符号数,故全是数值位--结果为 4294967168

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/1/30 18:45:09

**AI漫剧软件2025推荐,解锁沉浸式二次元内容创作新体验

AI漫剧软件2025推荐,解锁沉浸式二次元内容创作新体验据《2025年中国数字内容产业白皮书》显示,2025年AI生成视频内容的市场规模预计突破800亿元,其中二次元风格的AI漫剧因其独特的视觉表现力和高效的产能,成为增长最快的细分赛道之…

作者头像 李华
网站建设 2026/1/31 8:04:55

CSS3笔记

1. CSS 引入方式 行内式&#xff1a;直接写在标签 style"" 内&#xff08;优先级高&#xff0c;不推荐大量使用&#xff09;嵌入式&#xff1a;在 HTML 的 <head> 里写 <style>...</style>外部式&#xff1a;通过 <link rel"stylesheet&q…

作者头像 李华
网站建设 2026/2/1 1:18:36

模型炼金术:机器学习全流程中的超参数调优与评估陷阱

模型炼金术&#xff1a;机器学习全流程中的超参数调优与评估陷阱 1. 超参数调优的本质与价值 在机器学习项目中&#xff0c;超参数调优往往被视为"模型炼金术"——它既需要科学方法论指导&#xff0c;又依赖实践经验的微妙平衡。与模型参数不同&#xff0c;超参数是…

作者头像 李华
网站建设 2026/1/29 5:42:30

Chandra OCR多格式输出详解:同页同步生成Markdown/HTML/JSON三版本

Chandra OCR多格式输出详解&#xff1a;同页同步生成Markdown/HTML/JSON三版本 1. 为什么你需要一个“懂排版”的OCR 你有没有遇到过这样的场景&#xff1a; 扫描一份带表格的财务报告&#xff0c;用传统OCR导出后&#xff0c;表格全乱成一坨文字&#xff0c;还得手动一行行…

作者头像 李华
网站建设 2026/1/30 13:20:19

编程新王 Kimi K2.5,审美简直逆天!

在这个大模型卷翻天的时代&#xff0c;写代码的技术门槛已经无限趋近于零。只要会打字&#xff0c;配合现在的 AI 编程工具&#xff0c;大家都能在几分钟内开发一个功能完整的应用。不过&#xff0c;相对应的问题也随之而来&#xff0c;我们发现 AI 生成的网页&#xff0c;几乎…

作者头像 李华
网站建设 2026/2/1 17:59:09

Hunyuan MT模型部署慢?Ollama一键加载提速实战案例

Hunyuan MT模型部署慢&#xff1f;Ollama一键加载提速实战案例 1. 为什么HY-MT1.5-1.8B值得你重新关注翻译模型 很多人第一次听说HY-MT1.5-1.8B&#xff0c;是在看到它那句“手机端1GB内存可跑”的宣传语时——不是“理论上可行”&#xff0c;而是真正在安卓旧机型上实测跑通…

作者头像 李华