数据在内存中的存储

目录

一、整型在内存中的存储

1. 原码、反码、补码

2. 大小端介绍

3. 练习

二、浮点数在内存中的存储

1. 浮点数存储规则

IEEE 754规定:

有效数字M的保存和读取:

指数E的保存和读取 

2.  一个练习


一、整型在内存中的存储

1. 原码、反码、补码

计算机中的整数有三种 2 进制表示方法,即原码、反码和补码。
三种表示方法均有 符号位 数值位 两部分,符号位都是用 0 表示 ,用 1 表示
而数值位 正数的原、反、补码都相同。 负整数的三种表示方法各不相同。
原码
直接将数值按照正负数的形式翻译成二进制就可以得到原码。
反码
将原码的符号位不变,其他位依次按位取反就可以得到反码。
补码
反码 +1 就得到补码。
对于整形来说:数据存放内存中其实存放的是补码。

通过调试的内存窗口可以看出,内存中存放的确实是补码,但是顺序不太一样。

这是为什么呢?

2. 大小端介绍

什么大端小端:
大端(存储)模式,是指数据的低位保存在内存的高地址中,而数据的高位,保存在内存的低地址 中;
小端(存储)模式,是指数据的低位保存在内存的低地址中,而数据的高位, ,保存在内存的高地 址中。
为什么有大端和小端:
这是因为在计算机系统中,我们是以字节为单位的,每个地址单元 都对应着一个字节,一个字节为8 bit 。但是在 C 语言中除了 8 bit char 之外,还有 16 bit short 型,32 bit long (要看具体的编译器),另外,对于位数大于 8 位的处理器,例如 16 位或者 32 位的处理器,由于寄存器宽度大于一个字节,那么必然存在着一个如何将多个字节安排的问题。因 此就导致了大端存储模式和小端存储。
上面的a和b就是小端模式,低字节的14 和 f6 放在低地址中
我们常用的 X86 结构是小端模式,而 KEIL C51 则 为大端模式。很多的ARM DSP 都为小端模式。有些 ARM 处理器还可以由硬件来选择是大端模式 还是小端模式。

3. 练习

二、浮点数在内存中的存储

1. 浮点数存储规则

  • IEEE 754规定:

根据国际标准 IEEE (电气和电子工程协会) 754 ,任意一个二进制浮点数 V 可以表示成下面的形式:
(-1)^S * M * 2^E
(-1)^S 表示符号位,当 S=0 V 为正数;当 S=1 V 为负数。
M 表示有效数字,大于等于 1 ,小于 2
2^E表示指数位。

举例来说:

十进制的 -5.5,写成二进制是 -101.1相当于 -1.011×2^2 。

那么,按照上面 V 的格式,可以得出 S=1 M=1.011 E=2  
单精度(float):
对于 32 位的浮点数,最高的 1 位是符号位 s ,接着的 8 位是指数 E ,剩下的 23 位为有效数字 M
双精度(double):
对于 64 位的浮点数,最高的 1 位是符号位s,接着的 11 位是指数 E ,剩下的 52 位为有效数 M
  • 有效数字M的保存和读取:

 计算机在保存M时,因为M的值总是1.xxxxxxx,所以M的第一位被舍去,只保存后面的xxxxxx部分。比如,1.011,只保存011,在读取时,在前面加上1就行了

  • 指数E的保存和读取 

 首先,E为一个无符号整数(unsigned int

这意味着,如果 E 8 位,它的取值范围为 0~255 ;如果 E 11 位,它的取值范围为 0~2047 。但是,我们知道,科学计数法中的E 是可以出现负数的,所以IEEE 754 规定,存入内存时 E 的真实值必须再加上一个中间数,对于 8 位的 E ,这个中间数 是127 ;对于 11 位的 E ,这个中间 数是1023
比如 2^10 E 10 ,所以保存成 32 位浮点数时,必须保存成 10+127=137 ,即 10001001。
E 不全为 0 或不全为 1
这时,浮点数就采用下面的规则表示,即指数 E 的计算值减去 127 (或 1023 ),得到真实值,再将 有效数字M 前加上第一位的 1
比如:
5.5  的二进制形式为 101 .1,由于规定正数部分必须为1,即将小数点左移2位,
则为1.011*2^(2) ,其阶码为2 + 127 = 129 ,二级制表示为 10000001,
而尾数 1.011 去掉整数部分为 011 ,补齐 0 到 23 位 01100000000000000000000 ,
则其二进制表示形式为: 0 10000001 00000000000000000000000
E 全为 0
这时,浮点数的指数 E 等于 1-127 =  -126 (或者 1-1023 )即为真实值, 有效数字M 不再加上第一位的 1 ,而是还原为 0.xxxxxx 的小数。这样做是为了表示 ±0 ,以及接近于 0的很小的数字。
E 全为 1
这时,如果有效数字 M 全为 0 ,表示 ± 无穷大(正负取决于符号位 s );

2.  一个练习

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值