目录
一.大小端字节序
超过⼀个字节的数据在内存中存储的时候,就有存储顺序的问题。按照不同的标准来存储,可以分为 大端字节序存储 和 小端字节序存储。
大端字节序存储:把数据的低位字节内容存放在内存的高地址处,高位字节内容存放在低地址处。
小端字节序存储:把数据的低位字节内容存放在内存的低地址处,高位字节内容存放在高地址处。
在VS2022中,编译器采用的是小端字节序存储。
由于是小段字节序存储,所以0x11223344这个16进制数字在内存中是倒着存放的。
二.整数在内存中的存储
整数的二进制表示形式有三种,原码、反码和补码。
这三种形式都有符号位和数值位。
1.数值位的最高一位是符号位;
2.符号位“0”表示正,“1”表示负;
正整数的原、反、补码相同。
负整数的情况则不同。
原码:直接将数值按照正负数的形式翻译成⼆进制得到的就是原码。
反码:将原码的符号位不变,其他位依次按位取反就可以得到反码。
补码:反码+1就得到补码。
负整数的原 补码关系如下:
对于整型数据来说,整数在内存中存放的是它的补码。
这样做的好处是什么呢?
1. 加法和减法也可以统⼀处理(CPU只有加法器)
2.补码与原码相互转换,其运算过程是相同的,不需要额外的硬件电路。
三.浮点数在内存中的存储
浮点数与整数存储完全不一样。
根据国际标准IEEE(电气和电子工程协会)754,任意⼀个⼆进制浮点数V可以表示成下面的形式:
例子:⼗进制的5.0转换为二进制就是 101.0 == 1.01 * 2 ^ 2
此时 S = 0 M = 1.01 E = 2
对于不同类型的浮点数,具体的存储类型也不一样。
对于32位(float)浮点数,最⾼的1位存储符号位S,接着的8位存储指数E,剩下的23位存储有效数字M
对于64位(double)浮点数,最⾼的1位存储符号位S,接着的11位存储指数E,剩下的52位存储有效数字M
浮点数存储过程:
1.有效数字M
我们知道1 <= M <2,也就是说其可以表示为1.xxxxx的形式 。
IEEE 754规定,在计算机内部保存M时,默认M的第一位是1,因此可以被舍去,只保存后⾯的 xxxxxx部分。比如保存1.05的时候,只保存05,等到读取的时候,再把第⼀位的1加上去。
这样做可以节省1位有效数字,以32位浮点数为例子,留给M只有23位,将第⼀位的1舍去以后,等于可以保存24位有效数字。
2.指数E
首先也是最重要的一点,E是无符号整数(unsignedint)
如果E为8位,它的取值范围为0~255;如果E为11位,它的取值范围为0~2047。但我们知道科学计数法的指数是可以出现负数的。所以,放入内存的E等于其真实值加上一个中间数(8位的E,中间数为127;11位的E,中间数为1023)
为什么这样做?
以8位的E说明:
E是无符号整数,范围为0~255。但是我们又需要负指数,为了让正负指数的位数量基本均等,-127~128.存储的时候加上127,这样刚好是0~255,便于存储,不必判断符号位。
浮点数读取过程:
以指数E位标准,从内存中取出浮点数有以下三种情况:
1.E不全为0或不全为1
存入内存的E减去127(或者1023)得到E的真实值,将有效数字M加上第一位的1。
例子:
0.5的⼆进制形式为0.1,那就是1.0*2^(-1),其E为-1 + 127=126,表⽰为01111110,⽽尾数1.0去掉”1“为0,补⻬0到23位 00000000000000000000000,则其⼆进制表示形式为:
2.E全为0
E全为0,那真实的E按理来说应该就是-127。但是真实情况是E = 1 - 127 这是特殊情况!!!
此时,有效数字M不再加上第一位的“1”,而是还原成0.xxxxxx的小数。
这样做的原因:真实的E为-126,那么这个数已经是非常非常小的,无限接近于0,M加不加上第一位的“1”,已经没有什么影响了。
3.E全为1
E全为1,即11111111,转换为十进制就是255,那真实的E就是128。
128次方,这个数已经是无穷大了。
最后我们一道题目结束:
有缘再会,拜拜!
摸鱼摸鱼😴✨🎞