一.数据在内存中的存储
存储方式可分为大端字节序存储和小端字节序存储两种。
大端字节序存储:
把数据的低位字节内容放在高地址处,高位字节内容放在地地址处。
11 22 33 44 |
低地址 ——————————————————————————> 高地址
小端字节序存储:
把数据的低位字节内容放在低地址处,高位字节内容放在高地址处。
44 33 22 11 |
低地址——————————————————————————> 高地址
二.整数在内存中的存储
整数在内存中以补码的形式存放,最高位表示符号位(0表示正数,1表示负数)。
正整数: 原码,反码,补码都相同。
负整数: 原码 —— 符号位不变,数值取反 ——> 反码 —— +1 ———> 补码
在存储时可能出现截断当再次取出时先要整形提升。
例:
int main()
{
char a = -1;
signed char b = -1;
unsigned char c = -1;
printf("a=%d b=%d c=%d", a, b, c);
return 0;
}
结果:
-1:原码:10000000000000000000000000000001
反码:11111111111111111111111111111110
补码:11111111111111111111111111111111
在存储的过程整char类型为8个比特位,发生截断,存储低8位。
内存中a:11111111 b:11111111 c:11111111
以%d(十进制有符号整数)的形式打印
进行整形提升:无符号高位补0,有符号高位补符号位。
a:11111111111111111111111111111111
b:11111111111111111111111111111111
c: 00000000000000000000000011111111
三.浮点数在内存中的存储
存储方式IEEE(电气和电子工程协会)754标准:
任意的二进制浮点数V可表示为:
V=(-1)^s * M * 2^E
(-1)^S表示符号位 S=0,V为正数 S=1,V为负数
M表示有效数字
2^E表示指数位
例:
10进制:5.5 2进制:101.1 科学计数法:1.011 * 2^2
V=(-1)^0 * 1.011 * 2^2
S=0
M=1.011
E=2
float类型:
第一位为S 第二位到第九位为E 后23位为M
double类型:
第一位为S 第二位到第九位为E 后52位为M
存储规定:
M:M为1.xxxxxx默认第一位总是1(舍弃)只保留后面的xxxxx
例:1.01只保存01,读取时再加第一位的1(节省一位有效数字,提高精度)
E:E为无符号整数 float类型范围:0-255 double类型范围:0-2047
因为科学技术法中E可能为负数,所以在内存中E的值为E+中间数
float类型:E=E+127 double类型: E=E+1023
例:5.5 E:2+127=129
0 10000001 01100000000000000000000
S E M
取出规定:
E不全为0或不全为1:
E减去127(或1023)得到实际值,再将有效数字M前加上第一位的1
E全为0:
表示该数接近于0,E为1-127(或1-1023)得到实际值,M不再加第一位的1,还原为0.xxxxx
E全为1:
若M全为0,表示正负无穷大