【C语言】玩转存储——深度剖析数据在内存中的存储!_c语言就是玩转内存(1)

img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上C C++开发知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以戳这里获取

文章目录

前言

了解数据的在编译器中是如何存储对于我们了解底层的运行有很大的帮助,所以我们很有必要学习一下数据的存储。


一、数据类型详细介绍

1.数据类型

C语言允许使用的数据类型如下:

在这里插入图片描述

如果说一个变量是在内存上挖了一个坑并且给这个坑命名的话,那么类型指的就是这个坑的尺寸。

因为,我们不同类型所占存储空间的大小是不一样的。

所以我们可以了解到,类型的意义是什么?

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

2.signed 和unsigned

【作用】

限定char类型和任何整型类型变量的取值范围

signed 表示该变量是带有符号的
unsigned 表示该变量是不带符号的

怎么理解?

带符号位的变量可以表示负数,而不带符号位的变量只能表示整数。

我们默认所有的整型变量都是signed的,也就是带符号位的。

int main()
{
	signed int i = -10;
	unsigned int j = -10;

	printf("i=%d\n", i);
	printf("j=%u\n", j);//无符号整数用%u来输出

	return 0;
}

在这里插入图片描述
大家可以看到,如果声明一个无符号类型的整数为负数的话,打出的数字就并非我们期待的-10,而是一个非常大的数?

为什么呢?大家可以思考一下。

要了解这个原因,我们需要知道整型在内存中是如何存储的。

往下看,我们就介绍到。

3.类型的基本归类

C语言中包含了5种基本的数据类型

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]

2、浮点数类型

float
double

3、构造类型

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

4、指针类型

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

5、空类型

void 表示空类型(无类型)
通常应用于函数的返回类型、函数的参数、指针类型

二、 整形在内存中的存储

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

1.原码、反码、补码

之前文章讲过
计算机中的整数有三种表示方法,即原码、反码和补码。
三种表示方法均有符号位和数值位两部分,符号位都是用0表示“正”,用1表示“负”。
负整数的三种表示方法各不相同。

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

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

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

int main()
{
	int a = -1;
	//10000000000000000000000000000001 -原码
	//11111111111111111111111111111110 -反码
	//11111111111111111111111111111111 -补码
	int b=1;
	//00000000000000000000000000000001 原码反码补码一样
	return 0;
}

正数的原、反、补码都相同。
对于整形来说:数据存放内存中其实存放的是补码。

在计算机系统中,数值一律用补码来表示和存储。原因在于,使用补码,可以将符号位和数值域 统一处理;
同时,加法和减法也可以统一处理(CPU只有加法器)此外,补码与原码相互转换,其运算过程 是相同的,不需要额外的硬件电路。

下面一个例子解释:

int main()
{
	int i = -20;
	unsigned int j = 10;
	//100000000000000000000000000010100
	//111111111111111111111111111101011
	//111111111111111111111111111101100- -20的补码
	//
	//000000000000000000000000000001010- 10的补码
	
	//111111111111111111111111111110110 两者相加之后在内存中依旧是补码,

	//111111111111111111111111111110101 转化为反码
	//100000000000000000000000000001010 转化为原码打印出来
	//-10
	//
	printf("%d\n", i + j);
	//按照补码的形式进行运算,最后格式化成为有符号整数
	return 0;
}

在这里插入图片描述

2.取值范围

数据类型的取值范围意味着这个变量可以存放的最大值和最小值。

我们如何计算这个值呢?

我们知道,计算器是二进制的。比特是CPU能读懂的最小单位,但是我们一般说内存机构的最小寻址单位是字节,而一个字节可以存放8比特。

而每个比特只能存放二进制的0或1,所以我们可以很容易计算出1字节可以存放最大的数是多少
在这里插入图片描述11111111转化成十进制就是255。

255就是1字节可以表示的最大值,也就是说1字节大小就是255。

那么1字节的最小值是多少呢?

上面我们说到了有符号位signed和无符号位unsigned。

显然,如果是无符号位的最小值肯定是0,因为它没有负数。

那对于有符号位的数来说,它1字节的最小值是多少呢?

根据我们上面说了计算机的存储形式中,我便很容易知道。
在这里插入图片描述
我们通过画图,可以观察到,有符号数的最小值时-128.

【总结】

1字节中
有符号数的取值范围是-128~127
无符号数的取值范围是0-255

此外,通过上图,我们也可以发现,使用补码来存放整数有一些特征:

当符号位为0的时候,后边的1越多,整数的值就越大;
当符号位为1的时候,后边的0越多,整数的值就越小。

3.什么是大小端

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



![img](https://img-blog.csdnimg.cn/img_convert/aa86c79b21f32c518f08c2b9eaaf3c92.png)
![img](https://img-blog.csdnimg.cn/img_convert/86bda595ede21116aee8b086db5f5558.png)

**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**

**[需要这份系统化的资料的朋友,可以添加戳这里获取](https://bbs.youkuaiyun.com/topics/618668825)**


**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**

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



[外链图片转存中…(img-hwyERA7T-1715851684809)]
[外链图片转存中…(img-lKUSS7RJ-1715851684810)]

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值