数据的存储
1. 整形在内存中的存储和整形提升
整数在内存中存储的是补码
那为什么在内存中偏要存储补码呢?
比如 (1-1)
这里我们要解释
补码可以将符号位和数值域统一处理
同时加法和减法也可以统一处理 (CPU只有加法处理器)
还有 补码和原码,原码和补码转化的方式是一样的(都是取反+1),不需要额外的电路
因此在内存中存储补码可以方便运算
简述一下整形提升
一、
1 | //-1 的补码为 |
有符号位的整形提升前面补1
无符号位的整形提升前面补0
二、
1 | char a = -128; |
char默认为 signed char 还是 unsigned char 并没有标准规定,取决于编译器
但 int 默认为 signed int
short 默认为 signed short
2. 大小端存储的介绍
在整形存储方式中我们注意到
我们运算出的 内存存储数据 在内存是反着来的
大小字节端的内存处理方式
大端存储模式(大端字节序) : 数据的低位字节序保存在内存的高地址处,数据的高位字节序保存在内存的低地址处
.
小端存储模式(小端字节序) : 数据的高位字节序保存在内存的高地址处,数据的低位字节序保存在内存的低地址处
什么是低位字节序和高位字节序呢
我们举一个很简单的例子
1 | int a = 0x11223344; |
就以这个a为例子
在a中, 11 就是最高位字节序,44就为最低位字节序
写出一个程序,判断当前机器的字节序
1 | int main() |
3. 浮点型在内存中的存储
浮点数的存储为IEE 754规定,任意一个浮点数可以表示为下面的形式:
(-1) ^S * M * 2 ^E
(-1) ^S 表示符号位, S == 0为正 , S == 1为负
M表示有效数字, 1 <= M < 2
2^E表示指数位
1 | 浮点数: 5.5 (十进制) |
每个值该分配多少空间,IEE 754 也有规定
float:
.
.
.
double:
关于M:
前面提到了M总是为1-2之间,因此M的表达式总是为
1.xxxxxxx
所以为了拥有更大的存储上限,IEE规定这个1可以省去
M内只存入小数点后几位
关于指数E:
首先,E是一个无符号整数
所以E为8位时,其取值范围为 02552047
E为11位时,其取值范围为 0
但是我们都知道指数在科学计数法中是可以为负数的
所以规定
存入内存时E的真实值必须加入一个中间数
8位时这个中间数为127
11位时这个中间数为1023
指数存入就是以上这些
指数取出就又可以分为三种情况了
情况 | 处理方式 |
---|---|
E不为全0并且不为全1 | 对指数减去127得到真实值,再将有效数字M前加上一位1 |
E为全0 | 此时E的真实值即为 1-127 或 1-1023,有效数字M前不再加1,而是还原为 0.xxxxx的小数,这样做表示±0,以及接近于0的很小数字 |
E为全1 | 表示±无穷大(正负取决于S) |
内存中怎么装这些东西?
1 | float a = 5.5f; |
我们可以验证一下