数据在内存中的存储

大小端字节序

概念

        数据在内存中存储的时候,有两种不同的存储顺序,我们将其称之为大端字节序存储和小端字节序存储,下面是它具体的概念:
        大端(存储)模式:

        是指数据的低位字节内容保存在内存的高地址处,而数据的高位字节内容,保存在内存的低地址处。

        小端(存储)模式:

        是指数据的低位字节内容保存在内存的低地址处,而数据的高位字节内容,保存在内存的高地址处。

如何判断大小端存储

        我们可以写一串代码来判断机器的字节序:

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

整数在内存中的存储

        首先我们要了解,整数的二进制的表示方法有三种:源码,反码,补码。

        对于有符号的整数,三种表示方法均有符号位和数值位之分,最高位即为符号位,其他位数值位。而符号位用“0”来表示正,“1”来表示负。

        正整数的源码,反码,补码相同。

        而负整数则各有不同

        源码:直接将数值按照正负数的形式翻译成⼆进制得到的就是原码。

        反码:将源码的符号位不变,其他位按位取反即可获得反码。

        补码:在反码的基础上加1。

        整数在内存中均以补码方式存储。

浮点数在内存中的存储

基本概念

        相比起整数,浮点数在内存中的存储更为复杂

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

V  = (−1) ∗ S M ∗ 2E

• (−1)S 表示符号位,当S=0,V为正数;当S=1,V为负数

• M 表示有效数字,M是大于等于1,小于2的

• 2E 表示指数位

        举例来说:十进制的3.25,写成二进制是为11.01,相当于1.101^3.

        按照上面的格式则可得S=0,M=1.101,E=3。

IEEE 754规定:

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

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

存储

        在浮点数的存储中,还有一些特别的规定。

        如对M:

        因为M的范围为[1.2),所以M一般表示为1.XXXXXX。

IEEE 754 规定,在计算机内部保存M时,默认这个数的第⼀位总是1,因此可以被舍去,只保存后面的xxxxxx部分。

        如保存1.101时,只保存后面的101,在取出时再自动加1,这样使得M所保存的位数更多,使数值更精确。

        而对于E:

        它使一个无符号整数,及意味着它取值范围为0~255(若E为11位,则为0~2047) 。但是在科学计数法中E是可以为负数的,所以有了以下规定:

以IEEE 754规定,存入内存时E的真实值必须再加上⼀个中间数,对于8位的E,这个中间数是127;对于11位的E,这个中间数是1023。

        如2^3的E为3,存入时必须加上127,3+127=130,所以存入的E为10000010。

取出

        指数E从内存中取出还分三种情况:

        E全为0:

        此时取出时M不加1,即为0.xxx的小数。

        E全为1:

        若此时M全为0,则表示无穷大

        其他:

        按正常流程走(E取出-127(或-1023),M取出+1)

————感谢你的观看!————

        

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值