【C】原来数据在内存中是这样存储的!

深度剖析数据在内存中的存储

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.01
2^2---->S = 0; M = 1.01; E = 2

IEEE 754规定:
对于32位浮点数,最高的1位是符号位S,接下来8位是指数E,剩下来23位为有效数字M。
在这里插入图片描述
对于64位的浮点数,最高的1位是符号位S,接着的11位是指数E,剩下的52位为有效数字M。
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_45437022/article/details/106347673