大小端字节序
概念
数据在内存中存储的时候,有两种不同的存储顺序,我们将其称之为大端字节序存储和小端字节序存储,下面是它具体的概念:
大端(存储)模式:是指数据的低位字节内容保存在内存的高地址处,而数据的高位字节内容,保存在内存的低地址处。
小端(存储)模式:
是指数据的低位字节内容保存在内存的低地址处,而数据的高位字节内容,保存在内存的高地址处。
如何判断大小端存储
我们可以写一串代码来判断机器的字节序:
#include <stdio.h>
int main()
{
int a = 1;
char* p = (char*) & a;
if (*p == 1)
{
printf("小端\n");
}
else
printf("大端\n");
return 0;
};
整数在内存中的存储
首先我们要了解,整数的二进制的表示方法有三种:源码,反码,补码。
对于有符号的整数,三种表示方法均有符号位和数值位之分,最高位即为符号位,其他位数值位。而符号位用“0”来表示正,“1”来表示负。
正整数的源码,反码,补码相同。
而负整数则各有不同:
源码:直接将数值按照正负数的形式翻译成⼆进制得到的就是原码。
反码:将源码的符号位不变,其他位按位取反即可获得反码。
补码:在反码的基础上加1。
整数在内存中均以补码方式存储。
浮点数在内存中的存储
基本概念
相比起整数,浮点数在内存中的存储更为复杂
根据国际标准IEEE(电气和电子工程协会) 754,任意⼀个⼆进制浮点数V可以表示成下面的形式:
V = (−1) ∗ S M ∗ 2E
• (−1)S 表示符号位,当S=0,V为正数;当S=1,V为负数
• M 表示有效数字,M是大于等于1,小于2的
• 2E 表示指数位
举例来说:十进制的3.25,写成二进制是为11.01,相当于1.101^3.
按照上面的格式则可得S=0,M=1.101,E=3。
IEEE 754规定:
对于32位的浮点数,最高的1位存储符号位S,接着的8位存储指数E,剩下的23位存储有效数字M
对于64位的浮点数,最高的1位存储符号位S,接着的11位存储指数E,剩下的52位存储有效数字M
存储
在浮点数的存储中,还有一些特别的规定。
如对M:
因为M的范围为[1.2),所以M一般表示为1.XXXXXX。
IEEE 754 规定,在计算机内部保存M时,默认这个数的第⼀位总是1,因此可以被舍去,只保存后面的xxxxxx部分。
如保存1.101时,只保存后面的101,在取出时再自动加1,这样使得M所保存的位数更多,使数值更精确。
而对于E:
它使一个无符号整数,及意味着它取值范围为0~255(若E为11位,则为0~2047) 。但是在科学计数法中E是可以为负数的,所以有了以下规定:
以IEEE 754规定,存入内存时E的真实值必须再加上⼀个中间数,对于8位的E,这个中间数是127;对于11位的E,这个中间数是1023。
如2^3的E为3,存入时必须加上127,3+127=130,所以存入的E为10000010。
取出
指数E从内存中取出还分三种情况:
E全为0:
此时取出时M不加1,即为0.xxx的小数。
E全为1:
若此时M全为0,则表示无穷大
其他:
按正常流程走(E取出-127(或-1023),M取出+1)
————感谢你的观看!————