【C语言】深度剖析数据在内存中的存储

1、引言

今天这篇博客是为了加深对数据在内存中的储存这一知识点的了解

2、数据类型

vs2019环境下
1、char — 大小为1个字节
2、short —大小为2个字节
3、int — 大小为4个字节
4、long — 大小为4个字节
5、long long — 大小为8个字节
6、float — 大小为4个字节
7、double —大小为8个字节

2.1、类型的基本分类

1、整型
char (等价于什么类型取决于编译器,但一般情况下等价于signed char)
unsigned char
signed char

short ==>signed short(等价于)
unsigned short [int] (无符号短整型)用%u来打印无符号数
signed short [int] (有符号短整型)用%d来打印有符号数

int ==>signed int
unsigned int (无符号整型)用%u来打印无符号数
signed int (有符号整型)用%d来打印有符号数

2、浮点数
float — 单精度浮点型
double — 双精度浮点型

3、构造类型(自定义类型)
1、数组类型,我们可以通过改变数组的元素来改变数组的类型
2、结构体类型 struct
3、枚举类型 enum
4、联合类型 union

4、指针类型
int* pi
char* pc
float* pf
void* pv

2.2、数据在内存中的储存

整型的二进制表示有3中表示形式:原码、反码、补码

而内存中存储的是二进制中的补码
在这里插入图片描述
那么为什么计算机中存二进制的补码?

原因:因为计算机实际上只会计算加法,在内存中存补码,可以将符号位和数值统一处理,同时加法和减法也可以统一处理,另外还有一个好处就是,补码和原码相互转换,运算过程是相同的(原码取反+1得到补码;补码取反+1可以得到原码)

2.3、大小端字节序

1、大端字节序存储:当一个数据的低字节序的数据放在高地址处,高字节序的数据放在了低地址处,这种存储方式就是大端字节序存储

2、小端字节序存储:当一个数据的低字节序的数据放在低地址处,高字节序的数据放在了高地址处,这种存储方式就是小端字节序存储

通俗的说
倒着存 — 小端
正着存 — 大端

int main()
{
	int a = 1;
	char* p = (char*)&a;
	if (1 == *p)
	{
		printf("小端字节序\n");
	}
	else
	{
		printf("大端字节序\n");
	}
	return 0;
}

Tips:
无符号char的取值范围 0~255
有符号char的取值范围 -128~127
所以运用无符号数充当循环条件的时候要小心死循环

limits.h 和 float.h两个头文件需要熟悉

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

任何一个二进制浮点数V可以表示成下面的形式
1、(-1) ^ S * M * 2^E
2、(-1) ^ S表示符号位,当S=0,V为正数;当S=1,V为负数。
3、M表示有效数字,大于等于1,小于2
4、2^E表示指数位

举例如下

//5.5 — 10进制的浮点数
//101.1 — 5.5的2进制形式,小数点后1位表示2的-1次方
//1.011*2^2 — 也可以写这种形式,即1.011乘2的2次方
//(小数点向左移动了两位)
//可以理解为-1^0* 1.011*2^2
//其中S = 0;M = 1.011;E = 2

Tips:
1、对于32位的浮点数,最高的一位是符号位S,接着的8位是指数E,剩下的23位为有效数字M(当S为 1 的时候浮点数为负数)
2、对于64位的浮点数,最高的一位是符号位S,接着的11位是指数E,剩下的52位是有效数字M(当S为 0 的时候浮点数为正数)

M是如何存入内存中的呢?
首先我们知道 M 大于等于1,小于2,也就是说,M可以写成1.xxxxxxxx的形式,其中xxxxxxx表示小数部分,所以在计算机保存M的时候,默认这个数的第一位总是1,因此可以被舍去,只保存后面的小数位,例如保存1.01的时候,只保存01,需要读取的时候再在前面加上1,所以等于可以保存24位有效数字

E是如何在内存中保存的呢?
首先在内存中E被视为无符号数,如果E为8位,它的取值范围为0~255; 如果E为11位,它的取值范围为0 ~ 2047,但是我们知道浮点数中E是会有负数的,所以标准规定,存入E的真实值必须在加上一个中间值,对E加以修饰,然后再存入内存中**(对于8位的E,这个中间数是127;对于11位的E,这个中间数是1023)**

举个例子:比如2^10的E是10,所以保存成32位浮点数时,必须保存成10+127=137,即10001001.

讲了怎么存入指数E,我们讲讲指数E如何从内存中取出
指数E从内存中取出的三种情况
1、E不为全 0 或 不为全 1
这时指数E的计算值减去127(或1023),得到真实值

2、E全为 0
这时浮点数的指数E等于1-127(或者1-1023)即为真实值
有效数字M 直接还原 为0.xxxx,这样做是表示为正负0,以及接近于0的很小的数字

3、E全为 1
这时,如果有效数字M全为 0 ,表示正负无穷大(正负取决于符号位S)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值