【C语言】深度剖析数据在内存中的存储---(附源码 | 建议收藏)

news2024/11/23 23:54:46

在这里插入图片描述

🚀write in front🚀
📝个人主页:认真写博客的夏目浅石.
🎁欢迎各位→点赞👍 + 收藏⭐️ + 留言📝
📣系列专栏:凡人修C传
💬总结:希望你看完之后,能对你有所帮助,不足请指正!共同学习交流 🖊
✉️如果无聊的话,就来逛逛我的博客栈吧stack-frame.cn

文章目录

  • 前言
  • 一、数据类型介绍
    • 1.1 类型的基本归类:
  • 二、整形在内存中的存储
    • 2.1 原码、反码、补码
    • 2.2 大小端介绍
  • 三、练习巩固
  • 四、 浮点型在内存中的存储
    • 4.1 浮点数存储规则
  • 总结


前言

在这里插入图片描述


好久没更新了,主要最近事情很多,非常忙,直到今天才给大家更新出来第一篇博客—深度刨析数据在内存中的存储

   本节学习的重点:

  • 1. 数据类型详细介绍
  • 2. 整形在内存中的存储:原码、反码、补码
  • 3. 大小端字节序介绍及判断
  • 4. 浮点型在内存中的存储解析

一、数据类型介绍

之前的学习过程当中我们认识了许多的数据类型以及他们所占存储空间的大小,例如:

char        //字符数据类型 1个字节
short       //短整型	2个字节
int         //整形 4个字节
long        //长整型 4个字节
long long   //更长的整形 8个字节
float       //单精度浮点数 
double      //双精度浮点数

类型的意义:

  1. 使用这个类型开辟内存空间的大小(大小决定了使用范围)。
  2. 如何看待内存空间的视角。

1.1 类型的基本归类:

整形家族:

char
 	unsigned char
 	signed char
short
 	unsigned short [int]
 	signed short [int]
int
 	unsigned int
 	signed int
long
 	unsigned long [int]
 	signed long [int]

浮点数家族:

float
double

构造类型:

> 数组类型
> 结构体类型 struct
> 枚举类型 enum
> 联合类型 union

指针类型:

int *pi;
char *pc;
float* pf;
void* pv;

空类型:

void

通常应用于函数的返回类型、函数的参数、指针类型。

二、整形在内存中的存储

我们之前讲过一个变量的创建是要在内存中开辟空间的。空间的大小是根据不同的类型而决定的。

所以数据到底是怎么存储的呢?
所以就给大家介绍一下数据的存储

2.1 原码、反码、补码

计算机中的整数有三种2进制表示方法,即原码、反码和补码。

三种表示方法均有符号位数值位两部分,符号位都是用0表示“正”,用1表示“负”,而数值位
正数的原、反、补码都相同
负整数的三种表示方法各不相同

原码
直接将数值按照正负数的形式翻译成二进制就可以得到原码。

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

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

在这里插入图片描述

对于整形来说:数据存放内存中其实存放的是补码。
在这里插入图片描述
对于这段代码进行分析:

#include<stdio.h>
int main()
{
	int a = 20;
	int b = -10;
	return 0;
}

根据vs2019的调试发现:a在内存中的存储是:14 00 00 00
         发现:b在内存中的存储是: f6 ff ff ff

我们可以看到对于a和b分别存储的是补码。但是我们发现顺序有点不对劲。
这是又为什么?
下面就介绍大小端的知识点。

2.2 大小端介绍

什么大端小端

大端(存储)模式,是指数据的低位保存在内存的高地址中,而数据的高位,保存在内存的低地址中;

小端(存储)模式,是指数据的低位保存在内存的低地址中,而数据的高位,,保存在内存的高地址中。

下面设计一些程序来实现大小端的判断:

思路:
在这里插入图片描述
设计方案一:

#include<stdio.h>
int main()
{
	int a=1;
	//分析:00000000000000000000000000000001 - 正数的原,反,补是一样的
	//写成16进制数字---小端存储:0x 01 00 00 00
	//写成16进制数字---大端存储:0x 00 00 00 01
	//所以:判断机器是大端存储还是小端存储,只需要看第一个数字是1还是0.
	char *p=(char *)&a;
	if(*p==1)
	{
		printf("小端存储\n");
	}
	else printf("大端存储\n");
	
	
	return 0;
} 

图示:
在这里插入图片描述
设计方案二:

#include<stdio.h>

int check()
{
	int i=1;
	return (*(char *)&i);
}

int main()
{
	
	int ret=check();
	
	if(ret==1) printf("小端存储\n");
	else printf("大端存储\n");
	
	return 0;
} 

图示:
在这里插入图片描述

三、练习巩固

练习1.

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;
}

下面就是我的分析

首先看到了char a=-1;
所以就是:

1.先写出-1的原,反,补
  1000000000000000000000000000001 - 原码
  1111111111111111111111111111110 - 反码
  1111111111111111111111111111111 - 补码

2.放到了char 的类型当中,所以不难想到要进行截断操作
  11111111 - a 

3.发现a是以%d的形式进行打印的:
  所以对a进行整形提升:
  	对于整形提升我又有一些知识想讲:
	  -1.对于有符号数是补符号位.
	  -2.对于无符号数是补0. 
4.所以:1111111111111111111111111111111 - a - 补码
		所以printf 为-1; 
同理:b也一样-1

对于c的分析:
10000000000000000000000000000001 - -1的原码
11111111111111111111111111111110 - -1的反码
11111111111111111111111111111111 - -1的补码
00000000000000000000000011111111 - 截断后按照无符号数
进行整形提升
所以打印就是255

在这里插入图片描述
练习2.

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

下面就是我的分析

	10000000000000000000000010000000
	11111111111111111111111101111111 -128的反码 
	11111111111111111111111110000000 -128的补码
	10000000 - a --截断 
	11111111111111111111111110000000 -整形提升 
答案:4294967168

第三题:

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

下面就是我的分析

答案与上一个题目一模一样。
在这里插入图片描述
第四道题:

4.
#include <stdio.h>
int main()
{
    int i= -20;
	unsigned  int  j = 10;
	printf("%d\n", i+j);
    return 0;
}

下面就是我的分析在这里插入图片描述
第五道题:

5.
unsigned int i;
for(i = 9; i >= 0; i--)
{
    printf("%u\n",i);
}

下面就是我的分析

无符号数一定大于等于0.

在这里插入图片描述
第六道题目:

6.
int main()
{
    char a[1000];
    int i;
    for(i=0; i<1000; i++)
   {
        a[i] = -1-i;
   }
    printf("%d",strlen(a));
    return 0;
}

下面就是我的分析

在这里插入图片描述
第七道题:

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

下面就是我的分析

unsigned char 类型的范围是0~255所以就是死循环打印。

四、 浮点型在内存中的存储

4.1 浮点数存储规则

根据国际标准IEEE(电气和电子工程协会) 754,任意一个二进制浮点数V可以表示成下面的形式:

(-1)^S * M * 2^E
(-1)^S表示符号位,当S=0,V为正数;当S=1,V为负数。
M表示有效数字,大于等于1,小于2。
2^E表示指数位。

这里我认为大家可以把浮点数的存储作为一个了解即可,其实目前用处并没有整形用处大

总结

  写到这里,深度剖析数据在内存中的存储算是讲完了,但是奈不住我讲的不好或者同学们没听懂,我的建议是给我提意见或者仔细多看几遍,这样才能学明白数据的内存存储

  我是夏目浅石,希望和你一起学习进步,刷题无数!!!希望各位大佬能一键三连支持一下博主,hhhh~我们下期见喽
在这里插入图片描述
如果无聊的话,就来逛逛我的博客栈吧stack-frame.cn

原创不易,还希望各位大佬支持一下 \textcolor{blue}{原创不易,还希望各位大佬支持一下} 原创不易,还希望各位大佬支持一下

👍 点赞,你的认可是我创作的动力! \textcolor{9c81c1}{点赞,你的认可是我创作的动力!} 点赞,你的认可是我创作的动力!

⭐️ 收藏,你的青睐是我努力的方向! \textcolor{ed7976}{收藏,你的青睐是我努力的方向!} 收藏,你的青睐是我努力的方向!

✏️ 评论,你的意见是我进步的财富! \textcolor{98c091}{评论,你的意见是我进步的财富!} 评论,你的意见是我进步的财富!

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

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

相关文章

让Tomcat服务器运行在Windows后台

让tomcat运行在Windows后台一、设置环境变量二、安装tomcat服务三、设置后台自动运行本机环境&#xff1a;win10一、设置环境变量 进入tomcat主目录的bin文件夹&#xff0c;复制路径 快捷键winr键唤出运行框&#xff0c;输入sysdm.cpl然后点击“确定”进入系统属性面板 在系统…

传统工科应该怎么学习机器学习or深度学习?

还是老生常谈。建议先不要直接上手机器学习/深度学习&#xff0c;先把你研究对象/信号的机理给搞清楚&#xff0c;然后再开始上现代信号处理&#xff0c;机器学习/深度学习算法&#xff0c;只有对你研究对象的机理深入了解&#xff0c;才能更好地对信号处理算法&#xff0c;机器…

【职工管理系统】C++全栈体系(十三)

职工管理系统 第一章 管理系统需求 职工管理系统可以用来管理公司内所有员工的信息 公司中职工分为三类&#xff1a;普通员工、经理、老板&#xff0c;显示信息时&#xff0c;需要显示职工编号、职工姓名、职工岗位、以及职责 普通员工职责&#xff1a;完成经理交给的任务 …

运算符重载及组合与继承

目录 一、运算符重载 1.1普通运算符重载 1.2特殊运算符重载 二、标准输入输出流 三、组合与继承 3.1组合 3.2继承 1) public继承方式 2) protected继承方式 3) private继承方式 小作业&#xff1a;模仿c的string类&#xff0c;自己实现string类 一、运算符重载 百度…

【文件随机读写和文件缓冲区】

1.1fseek函数 1.2ftell函数1.3rewind函数2. 文件读取结束的判定2.1文件缓冲区 1.1fseek函数 根据文件指针的位置和偏移量来定位文件指针。 int fseek ( FILE * stream, long int offset, int origin );看不懂没关系&#xff0c;举个例子你就明白了。 我们首先在text.txt文…

送什么礼物给小学生合适?保护视力的专业护眼台灯

在学生们过节以及生日来临&#xff0c;父母们会精心为孩子准备好礼物的&#xff0c;而最有实际意义的&#xff0c;是对学习有所帮助的&#xff0c;比如学习机、护眼灯、绘画本&#xff0c;能丰富孩子的生活都可以&#xff0c;这几年儿童青少年的近视率迅速上升&#xff0c;有52…

TypeScript中的 | 分隔符、 运算符、类型谓词is

一. | 分隔符 在 TypeScript 中联合类型&#xff08;Union Types&#xff09;表示取值可以为多种类型中的一种&#xff0c;联合类型使用 | 分隔每个类型。联合类型通常与 null 或 undefined 一起使用&#xff1a; const sayHello (name: string | undefined) > { /* ... …

WC!咱平时使用的PDF,原来这么不安全?

早前&#xff0c;在2019年3月初&#xff0c;来自明斯特大学及波鸿鲁尔大学的德国研究人员称&#xff0c;他们已经设法利用新发现的漏洞&#xff0c;并成功地攻破了PDF文件中的数字签名。 随后&#xff0c;2019年10月再次披露&#xff1a; 加密PDF存在PDFex漏洞。 最后&#x…

基于wordpress和Sakura主题插件搭建博客网站

基于wordpress和Sakura主题插件搭建博客网站1.引言2.认清现实3.使用的本地化方法4.分享自己走的一些弯路5.硬刚404的余波6.额外的收获1.引言 最近&#xff0c;本着试试的想法&#xff0c;想着找一个前端方面的工作&#xff0c;遇到一些招聘软件或者网站上面有一栏是个人博客网站…

我用递归写单调栈(?)

前言&#xff1a;嗯,这个题上午有的思路&#xff0c;敲了一中午代码&#xff0c;改了一下午最后超时? 题&#xff1a;D. Boris and His Amazing Haircut 题意&#xff1a;一个理发师可以把一段数组给建成一个高度&#xff0c;他现在每个高度的剪子都有若干个。给一个原始数组和…

STL - Set容器

基本概念 构造和赋值 功能描述&#xff1a;创建set容器以及赋值 #include <algorithm> //算法 #include <iostream> #include <set> #include <string> using namespace std;// set/multiset容器void printSet(set<int>& s) {for (set<i…

Java之节点流和处理流(Buffered字节字符处理流)

文章目录前言基本介绍Buffered字符处理流BufferedReader缓冲字符输入流BufferedWriter缓冲字符输出流文件拷贝Buffered字节处理流文件拷贝&#xff08;二进制文件&#xff09;处理流关闭问题前言 Java中的流按照功能可以分为节点流和处理流。其中节点流是直接用来访问数据源&a…

GO的interface的使用和反射

博客主页&#xff1a;&#x1f3c6;看看是李XX还是李歘歘 &#x1f3c6; &#x1f33a;每天不定期分享一些包括但不限于计算机基础、算法、后端开发相关的知识点&#xff0c;以及职场小菜鸡的生活。&#x1f33a; &#x1f497;点关注不迷路&#xff0c;总有一些&#x1f4d6;知…

自动化测试

一、关于自动化什么是自动化?扫地机器人 自动浇水机 自动洗手液 智能马桶... &#xff0c;能够有效的减少人力的消耗&#xff0c;同时提高生活质量。而自动化测试同样&#xff0c;能够有效减少人力的投入&#xff0c;同时提高了测试的质量和效率。回归测试&#xff0c;版本越来…

23.Isaac教程--Isaac导航

Isaac导航 ISAAC教程合集地址: https://blog.csdn.net/kunhe0512/category_12163211.html 节点和消息 Isaac 应用程序由多个节点创建。 导航堆栈具有以下节点&#xff1a; GlobalLocalization&#xff1a;在没有先验信息的情况下&#xff0c;仅使用当前范围扫描测量来估计地…

【JavaGuide面试总结】MySQL篇·上

【JavaGuide面试总结】MySQL篇上1.SQL语句在MySQL中的执行过程MySQL架构Server 层基本组件介绍查询语句分析更新语句分析总结2.MySQL更新语句为什么要用两个日志模块&#xff0c;用一个日志模块不行吗?3.MySQL 支持哪些存储引擎&#xff1f;默认使用哪个&#xff1f;4.MySQL 存…

虹科分享 | TSN时间敏感网络测试框架

一、时间敏感网络 时间敏感网络&#xff08;TSN&#xff09;允许合并OT和IT世界&#xff0c;并保证确定性以太网网络中所有设备的互操作性和标准化。TSN建立在一个真正成熟的生态系统中&#xff08;如以太网&#xff09;&#xff0c;因此大家认为TSN将是下一代工业网络通信的核…

top命令详解

1. 命令参数 d : 监控内容刷新的时间间隔。 n : 限定监控内容刷新的次数&#xff0c;完成后将会退出 top 视图。 p : 只监控指定PID的进程。 -b : 以非交互非全屏模式运行&#xff0c;一般配合-n指定输出几次统计信息&#xff0c;将输出重定向到指定文件&#xff0c;比如 top …

二分查找----C/C++

目录 1. 二分查找的概念 2. 整数的二分 2.1 二分的模版一 2.2 二分的模版二 2.3. 案例剖析 2.4.整数二分总结 3. 浮点数的二分 1. 二分查找的概念 折半查找(BinarySearch)技术&#xff0c;又称为二分查找。它的前提是线性表中的记录 必须是关键码有序(通常从小到大有序)&a…

mysql 分库分表、 分区(partition)、sharding-sphere 综合整理

引言&#xff1a; 一般情况下&#xff0c;如果单表数据量超过2000w的样子查询速度会很慢&#xff0c;因为内存无法存储其索引&#xff0c;使得之后的 SQL 查询会产生磁盘 IO&#xff0c;从而导致性能下降。解决方案&#xff1a;mysql 分区 、 分表处理 分库分表&#xff1a; 原…