整数与浮点数在内存中存储
整数在内存中如何存储
整数在内存中以补码形式存储的。正数的原、反、补码数相同,负数三种码表示不同。反码是按符号位取反,补码是反码+1。例如
正整数
00000110--原码
00000110--反码
00000110--补码
负整数
10000110--原码
11111001--反码
11111010--补码
大小端字节序
其实超过⼀个字节的数据在内存中存储的时候,就有存储顺序的问题,按照不同的存储顺序,我们分
为⼤端字节序存储和⼩端字节序存储,下⾯是具体的概念:
⼤端(存储)模式:是指数据的低位字节内容保存在内存的⾼地址处,⽽数据的⾼位字节内容,保存
在内存的低地址处。
⼩端(存储)模式:是指数据的低位字节内容保存在内存的低地址处,⽽数据的⾼位字节内容,保存
在内存的⾼地址处。
上述概念需要记住,⽅便分辨⼤⼩端。
#include <stdio.h>
int main()
{
int a = 0x11223344;
return 0;
}
在内存中,一般都是小端存储,为44 33 22 11
浮点数在内存中存储
浮点数类型:float、double、long double类型。
在内存中如何存储
根据国际标准IEEE(电⽓和电⼦⼯程协会) 754,任意⼀个⼆进制浮点数V可以表⽰成下⾯的形式:
V = (−1) ∗ S M ∗ 2E
• (−1)S 表⽰符号位,当S=0,V为正数;当S=1,V为负数
• M 表⽰有效数字,M是⼤于等于1,⼩于2的
• 2
E 表⽰指数位
举例来说:
⼗进制的5.0,写成⼆进制是 101.0 ,相当于 1.01×2^2 。
那么,按照上⾯V的格式,可以得出S=0,M=1.01,E=2。
⼗进制的-5.0,写成⼆进制是 -101.0 ,相当于 -1.01×2^2 。那么,S=1,M=1.01,E=2。
IEEE 754规定:
对于32位的浮点数,最⾼的1位存储符号位S,接着的8位存储指数E,剩下的23位存储有效数字M
对于64位的浮点数,最⾼的1位存储符号位S,接着的11位存储指数E,剩下的52位存储有效数字M
float类型
double类型
存的过程
对于指数E和M,有一些特殊规定。
E是一个无符号整数。
取的过程
E分为不全为0或不全为1,E全为0,E全为1。