数据在内存中的存储——C语言

前言

我们知道,CPU在运算中会向内存中读写数据,那么数据又以何种形式存储在内存中呢?本文将简单介绍整型和浮点型在内存中的存储方式

整型在内存中的存储

通过查阅资料我们得知,整型在内存中存储的是它的补码,那么什么又是补码呢?为什么存储的是补码呢?

源码,反码与补码

原来,我们把十进制的数字直接翻译得到的二进制数字就是源码。并且定义第一位为符号位,其他位数为数值位(存储有符号数据时)。

但是我们在存储源码的时候又遇到了问题:我们的CPU只有加法器,源码的存储方式无法实现减法的功能。由此我们巧妙的利用溢出的特性,设计出补码,巧妙的将减法转换成减法。补码的出现也使得符号位和数值域可以统⼀处理。反码则是源码到补码换算时的中间产物。

换算关系

正整数的原、反、补码都相同。
负整数的三种表示方法各不相同。
原码:直接将数值按照正负数的形式翻译成⼆进制得到的就是原码。
反码:将原码的符号位不变,其他位依次按位取反就可以得到反码。
补码:反码+1就得到补码。
此外,补码与原码相互转换,其运算过程是相同的,不需要额外的硬件电路。

数据在内存中存储的字节顺序——大小端

我们知道一个整型占四个字节,一个指针可以指向一个字节的空间,那么整型的四个字节在内存中的存储也应该有顺序问题。这个顺序无非是正序和逆序,其他存储顺序都是将无端将问题复杂化,在设计之初就应当避免。

什么是大小端

其实超过⼀个字节的数据在内存中存储的时候,就有存储顺序的问题,按照不同的存储顺序,我们分
为大端字节序存储和小端字节序存储,下面是具体的概念:
大端(存储)模式:是指数据的低位字节内容保存在内存的高地址处,而数据的⾼位字节内容,保存在内存的低地址处。
小端(存储)模式:是指数据的低位字节内容保存在内存的低地址处而数据的高位字节内容,保存在内存的高地址处。

笔者喜欢记忆成:有低地址向高地址,先遇到低位数据就是小端存储,先遇到高位数据就是大端存储。
为什么会有大小端的存储方式,笔者认为也是规范CPU在向内存读取数据,读写的规则一致即可保证正确读取数据

一个简单的判断大小端的程序

#include <stdio.h>
int check_sys()
{
	int i = 1;
	return (*(char *)&i);
}
int main()
{
	int ret = check_sys();
	if(ret == 1)
	{
		printf("小端\n");
	}
	else
	{
		printf("大端\n");
	}
	return 0;
}

浮点型在内存中的存储

浮点型的存储没有源反补的概念,但字节顺序和前面整型的存储相同,也有大小端的问题,这里不在赘述。

浮点型的存储(IEE754)

我们通过查阅相关资料得知,浮点型的数据在内存中的存储遵循IEE754的标准,下面笔者将简单介绍一下这个标准

根据标准,任意一个浮点数 V 都可以表示为一下形式:

V = (-1) ^ S * M  * 2^E

对于32位的浮点数,最⾼的1位存储符号位S,接着的8位存储指数E,剩下的23位存储有效数字M
对于64位的浮点数,最⾼的1位存储符号位S,接着的11位存储指数E,剩下的52位存储有效数字M

一些规定

  1. M可以写成 1.xxxxxx 的形式,其中 xxxxxx 表示小数部分。IEEE754规定,在计算机内部保存M时,默认这个数的第⼀位总是1,因此可以被舍去,只保存后⾯的 xxxxxx 部分。这样可以多保存一位有效数据,提高精确度
  2. E为⼀个无符号整数(unsigned int )。如果E为8位,它的取值范围为0~255;如果E为11位,它的取值范围为0~2047。但是,我们知道,科学计数法中的E是可以出现负数的,所以IEEE754规定,存入内存时E的真实值必须再加上⼀个中间数,对于8位的E,这个中间数是127;对于11位的E,这个中间数是1023
  3. E不全为0或不全为1 的读取,只需要按转换的方式反向操作即可
  4. E全为0 的读取,这时,浮点数的指数E等于1-127(或者1-1023)即为真实值,有效数字M不再加上第⼀位的1,而是还原为0.xxxxxx的小数。这样做是为了表示±0,以及接近于0的很小的数字
  5. E全为1 的读取,这时,如果有效数字M全为0,表⽰±⽆穷⼤(正负取决于符号位s)
     

结语

以上便是今天的全部内容。如果有帮助到你,请给我一个免费的赞。

因为这对我很重要。

编程世界的小比特,希望与大家一起无限进步。

感谢阅读!

  • 16
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值