数据在内存中的存储

我们在前面已经学会了许多代码的编写,但是我们对于我们的数据是如何存储在内存空间中依旧不够清晰。那么,这篇文章主要讲的就是大小端的差别,符号数据的大小以及浮点数在内存中的存储方式。

大小端存储的差别

        在计算机中,为了数据存储时的整齐与有序,根据处理器的不同以及编译器的不同,数据的存储往往分为了大端存储与小端存储。例如,对于一个short类型的x,他的x值是0x1122,那么0x11就是他的高字节,0x22就是他的低字节。大端存储就是高字节存储到低地址处,低字节存储到高地址处。那么这个元素在内存中的存储就是0x1122.而小端存储正好相反,存储的是0x2211。大部分的X86架构都是小端结构,如果是用于编写嵌入式设备的keil C51则是使用大端模式。下面一张图是一个简单检测您的机器和编译器是大端还是小端存储的简单方法:

#define _CRT_SECURE_NO_WARNINGS 1

# include "stdio.h"

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


int main()
{
	int ret = Test();
	if (ret  == 1)
	{
		printf("小端\n");
	}
	else
	{
		printf("大端\n");
	}

	return 0;
}

那么,关于数据的符号类型,我们分为了有符号数据与无符号数据。有符号数据前面会有一个signed ,无符号数据前面会有一个unsigned。如果没有特殊声明,那就有符号数据。无符号数据的大小比有符号数据大了一倍。因为无符号数据将最高位的符号位也作为数据进行处理,使得2能够多计算一次方。因为char类型的数据比较小,接下来,我们就拿char类型进行举例,看看有符号与符号的数据在一些特定场合下会有什么结果。

NO.1

nt main()
{
	char a = -1;
	unsigned char b = -1;
	printf("%d %d", a, b);

}

该代码第一行是普通的有符号字符赋了-1,第二行是无符号字符b赋了-1,printf最后会打印出-1和255,。a打印出-1比较好理解,那么255是如何打印出来的呢?在内存中,-1原码是1000 0001,补码是1111 1110,补码是1111 1111,因为b是无符号字符,那么他在看到1111 1111时,他会认为这是一个所有位数都是数据的数字,那么就得到了255.

NO.2

int main()
{
	char a = -128;

	printf("%u", a);

}

第二个是一个有符号字符a被赋给了-128的数据,但是由于这是一个char类型数据,所以在打印的时候会发生整形提升,因为这个数字是负数,所以发生整形提升的时候填充的是1,然后填充了原本属于-128的数据,在计算以后,答案就是4294967168。那如果是a是128,则会因为溢出而导致该数据变成-128,所以最后答案也还是4294967168。

浮点数的存储方式

C语言中常见的浮点数有3.234与1E10这样的,E代表的是0.的意思。但是,我们是无法强制将float类型转换成int类型的。那么,在内存中,float类型到底是如何存储的呢?

在内存中,假设一个浮点数V,他是由三个参数决定,S,M,和E。S决定浮点数的正负,M是该浮点数的有效数字,M范围大于1小于2,E是2的指数级,V   =  (−1) 的S次方 *M ∗ 2的E次方。对于32位浮点数,那么就是1位的符号位,8位的E,也就是2的次方数,剩下的23位是M,也就是有效数字位。而对于Double,双精度浮点数,他的大小是64位,1位的符号位,11位的E,52位的M位。

而对于浮点数的读取,因为E是1个unsigned int类型的数据,但是E有可能有负数,为了防止出现一些我们不想要的状况,我们在最开始会将E加上127的数据,得到一个计算值。并且因为M的值整数位必定是1,于是在计算时会主动去掉这个1,在计算完以后再加上这个1.

而对于整个的数据的处理,我们有三种效果,第一种是E不全为0或者不全为1,那么就会将E的计算值减去127,得到真实值。第二种是E全为0,那么在最后计算的时候M就会不再加上1,这样做是为了表示+-0,一个非常小的数字而对于第三种E 全为1,则是表示一个非常巨大的数据。

以上,就是我对数据和浮点数的理解。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值