前言
最近要考试,咱就少写博客了。(虽然已经断更了很长一段时间了,嘿嘿)话不多讲。
开始!!!
一、整数存储方式(引入大小端)
我们都知道我们的cpu因为只有加法处理器,因此当处理负数是就必须要使用一些手段,也就是我们的原、反、补码。
稍微讲一下正数我们的原码、反码、补码相同,但,负数原反补需要运算
如-2:
原:10000000000000000000000000000010
反:1111111111111111111111111111111111101
补:1111111111111111111111111111111111110
下图为编译器里存储的-2。(在显示时为16进制每一行为一个字节,int 为四个字节所以就截了四行)
OK,我们知道了整形的存储方式了但是我们又不禁会想为啥他地址从低到高的时候是feffffff而不是fffffffe呢?
此时我们就可以引出大小端储存
二、大小端储存
首先我们要知道大小端储存是跟编译器不同而不同
OK,我们先将大端小端的书面意思告诉大家
大端(存储)模式:是指数据的低位保存在内存的高地址中,而数据的高位,保存在内存的低地址中。
小端(存储)模式:是指数据的低位保存在内存的低地址中,而数据的高位,,保存在内存的高地址中。
我们用int a = 0x11223344来演示
(地址是我从VS2019现扣出来的)
(VS2019为小端存储)
我们在编译器将它用四列为一行时
我们在定义变量时将44放在了最低位数上(类似个位十位百位那种我们将个位称为数据的低位然后大小端的存储我们就类比思想就很容易想明白了)我们就称44为数据的低位我们将44放在了低地址处这也就符合了小端储存的低位放在低地址处。
当然如果不想理解就直接大放大 小放小为小端存储就好了。大端就相反
浮点数的存储
例子
先来个例子勾一下好奇心,嘿嘿 。
同为4个字节的关键字因为存储读取的不同在同一个数字就会有巨大的区别。
下面我们来对浮点型的存储方式进行讲解
浮点型存储读取方式
以5.5为例,十进制的5.5转化成二进制位101.1
而在存储二进制的时候我们将二进制利用科学计数法将101.1变成1.011*22 而当负数存储时我们就会在前面加一个-1
所以我们的浮点型在存储时就根据IEEE 754的规定将十进制的数字拆成二进制并写成下面的形势
(-1)S ×M × 2E
S为0时为正数为1时为负数
M的数值1<=M<2
E为指数位
(其实和十进制的科学计数法几乎一样)
(下图为float(四字节)类型在编译器的存储方式)
下图为double(八字节)类型存储方式
下面我以float(四字节)为例进行讲解 :
我们除了对E、M、S进行数值上的要求还进行了其他优化之类
如:
对M:
因为M的值在1<=M<2及1.xxxxxx所以我们在存储时干脆不对1进行存储而对0.xxxxx存储到M的位置中这样我们对M存储精度就会再次增加。
对E:
对E情况比较复杂首先我们要知道在存储E时我们是按照unsigned的标准进行存储及E没有负数形式但我们在用科学计数法时我们的指数位是有负数情况的所以我们就规定再存储时我们要先对E加上127(四字节时)然后再进行存储。
在E不全为1或0时:
在E存储的数据不全为零或一时我们要想使用E的数值我们就先对其减去127就可以正常使用我们也得到了指数位的负数情况
当E全为零时:
我们知道在存储时我们的E已经先加上了127但是依旧在存储时为全为零我们就可知我们得到的数及其小,这是我们就将M直接用为0.xxxx也就直接将该值看做0
当E全为1时:
这是有效数字M全为0直接将该数定义成无穷。
这时我们就可以解释前面的例题了:
我们在存储a时为0x0000000a而当他存储到浮点型时我们不难发现s=0(一个bit);E=0(8个bit);我们E全为0时我们的浮点型也就为0。下面思路类似。
结束废话
本章主要对底层逻辑知识进行了一次进阶提升。有点难理解大家可以找部分视频一起理解。
再见ヾ( ̄▽ ̄)ByeBye