数据在内存中的存储方式(C语言)

目录

1. 整形在内存中的存储

        1.1 原码、反码、补码

        1.2 大小端介绍

2. 浮点型在内存中的存储

        2.1 浮点数存储规则

 IEEE 754规定:

IEEE 754对有效数字M和指数E,还有一些特别规定

        2.2 关于指数E

 E全为0

E全为1


1. 整形在内存中的存储

        1.1 原码、反码、补码

计算机中的整数有3种2进制的表达方式,即原码、反码和补码。

其中,三种码的第一位均为符号位,0表示正数,1表示负数。如果整形为无符号数(unsigned)则没有符号位。

正数的原码、反码和补码相同。

例如:

26的2进制数为 00011010

由于是正数,因此它的原码、反码和补码都是 00011010

负数的原码、反码和补码均不同

原码

将数值按正负数的形式翻译成2进制就可以得到原码

        例如:

        -1的原码为 10000001

        第一位为符号位,是1则为负数。

反码

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

        例如:

        -1

        原码: 10000001

        反码: 11111110

补码

将反码+1就可以得到补码

        例如:

        -1

        反码:11111110

        补码:11111111

这里有一种可以直接读取补码的方法:

即把符号位当做该权重的负数,例如在8bit下,符号位可以读作-128,然后依次加上前面的值。

 

对于整形来说:数据存放在内存中的其实是补码

在计算机系统中,数值一律使用补码的形式来表示和存储。因为使用补码可以将符号位和数值域统一处理。

加上CPU只有加法器,储存补码令运算过程相同,不需要额外的电路。

负数的补码中也可以同时做到取反再+1得到负数的原码

-1

补码:11111111

反码:10000000

原码:10000001

        1.2 大小端介绍

什么是大小端:

大端存储模式:指数据的低位保存在内存的高地址中,而数据的高位,保存在内存的低地址中;

小端存储模式:指数据的低位保存在内存的低地址中,而数据的高位,保存在内存的高地址中;

从图中可以看到在内存中的存储是反过来的,即是小端存储模式。

每个数据以字节为单位将低位保存在低地址。 

2. 浮点型在内存中的存储

        2.1 浮点数存储规则

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

  • (-1)^S * M * 2^E
  • (-1)^S表示符号位,当S=0,V为正数;当S=1,V为负数。
  • M表示有效数字,大于等于1,小于2.
  • 2^E表示指数位

 IEEE 754规定:

对于32位浮点数(单精度浮点数),最高的1位是符号位S,接着的8位是指数位E,剩下的23位为有效数字M。

 对于64位浮点数(双精度浮点数),最高的1位是符号位S,接着的11位是指数位E,剩下的52位为有效数字M。

 

IEEE 754对有效数字M和指数E,还有一些特别规定

前面说过,M是大于等于1及小于2的数,因此M可以写成 1.xxxx 的形式,其中 xxxx 表示小数部分。 

IEEE 754规定,在计算机内部保存M是,默认将第一位数舍去,到读取数据时再加上整数部分
的1。只保存后面的小数部分,这样做可以节省1位有效数字。以32位浮点数为例,留给M只有23位,若将第一位的1舍去后,可以保存24位有效数字。

        2.2 关于指数E

E为一个无符号数(unsigned int)

当E为8位,它的取值范围为0~255;当E为11位,它的取值范围为0~2047。但是,科学计数法中的E是可以为负数的,所以IEEE 754规定,存入内存时E的真实值必须再加上一个中间数,对于8位的E,这个中间数为127;对于11位的E,这个中间数为1023。

例如:

2^5的E是5,所以保存成32位浮点数时,应为5+127=132,即10000100。

E在内存中取出还可以分出3中情况:

E不全为0或不全为1

此时的浮点数采用下面的规则表示,即指数E的计算式减去127(或1023),得到真实值,再在有效数字M前加上第一位的1。

例如:

 E全为0

此时的浮点数E等于1-127(或者1-1023)即为真实值,有效数字M不再加上第一位的1,而是还原成0.xxxxxx的小数。这样做是为了表示±0,以及接近于0的数字。

E全为1

此时,如果有效数字M全为0,表示±无穷大;

 

评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值