深度剖析数据在内存中的存储
1.数据类型的介绍
1.1整型家族
char //字符类型
unsigned char //无符号字符类型
signed char //有符号字符类型
short
unsigned short [int]
signed short [int]
int
unsigned int
signed int
long
unsigned long [int]
signed long [int]
1.2浮点数家族
float//单精度
double//双精度
1.3构造类型
struct//结构体类型
enum//枚举类型
union//联合类型
数组类型
1.4指针类型
int *pi;
char *pc;
float *pf;
void *pv;
2.整型数据在内存中的存储
变量的创建需要在内存中分配空间,空间大小由数据的类型决定
2.1.三码
整型二进制数位分位符号位和数值位,符号位用0表示“正”用1表示“负”
原码:直接将二进制按照正负数的形式翻译成二进制就可以。
反码:将原码的符号位不变,其他位依次按位取反就可以得到了
0—>1 ;1—>0
补码:反码+1就得到补码。
2.1.整数的三码
正数:原码=反码=补码
负数:符号位为1的正数原码的补码
对于整型来说:数据在内存中存储的是补码
由图可见:
int型20的内存地址为:0x012FF9DC~0x012FF9DF(4字节)
在4个字节中存储的数据为:14 00 00 00
int型-10的内存地址为:0x012FF9D0~0x012FF9D3(4字节)
在4个字节中存储的数据为:f6 ff ff ff
为什么在内存中存储的是:14 00 00 00和f6 ff ff ff而不是00 00 00 14和ff ff ff f6?????????????
答案:整型数据存储分大端存储模式、小端存储模式
大端存储模式:指数据的低位保存在内存的高地址中,而数据的高位保存在内存的低地址中
小端存储模式:指数据的低位保存在内存的低地址中,而数据的高位保存在内存的高地址中
大端模式图解
小端模式图解
百度面试题
请简述大端字节序和小端字节序的概念,设计一个小程序来判断当前机器的字节序。
#include <stdio.h>
//代码1
int check_sys(){
int i = 1;
return (*(char *)&i);
}
//代码2
int check_sys(){
union{
int i;
char c;
}un;
un.i = 1;
return un.c;
}
int main()
{
int ret = check_sys();
if(ret == 1){
printf("小端\n");
}
else{
printf("大端\n");
}
return 0;
}
2.3.整型数据的定义写入读取三步走
定义变量:根据数据类型开辟相应大小的空间
写入数据:写入数据的二进制序列
读取数据:按照变量类型来解释变量中的二进制序列的含义
接下来我根据例题来分析这句话
代码:
#include <stdio.h>
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.定义变量:a、b、c三个变量都是char类型,所以分别开辟1个字节的空间给a、b、c三个变量(这里无需考虑unsigned和signed)
2.写入数据:由于-1的二进制补码是ff
3.读取数据:因为a、b是有符号char型,按照正常char类型对待,所以以%d输出依然还是-1。因为c是无符号char型,所以此时对于ff的理解就改变了,这里的二进制11111111最高位便不再是符号位,而是数值位,这里就被理解成十进制的255了。
根据例题解释你应该对于整型的定义存储读取有了一定的认识了吧!
3.浮点型在内存中的存储
根据国际标准IEEE(电气和电子工程协会)754,任意一个二进制浮点数V可以表示成下面的形式:
- (-1)^S * M * 2^E
- (-1)^s表示符号位,当s=0,V为正数;当s=1,V为负数。
- M表示有效数字,大于等于1,小于2。
- 2^E表示指数位
例如:
-5.0----> -101.0----> -1.012^2---->S = 1; M = 1.01; E = 2
5.0----> 101.0----> 1.012^2---->S = 0; M = 1.01; E = 2
IEEE 754规定:
对于32位浮点数,最高的1位是符号位S,接下来8位是指数E,剩下来23位为有效数字M。
对于64位的浮点数,最高的1位是符号位S,接着的11位是指数E,剩下的52位为有效数字M。