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

本文深入探讨了C语言中数据的存储方式,包括数据类型的介绍,特别是整型和浮点型在内存中的存储机制。讲解了原码、反码和补码的概念,以及内存中为何使用补码存储数据的原因。同时,介绍了大小端存储模式,解释了其存在的原因。此外,还讨论了浮点数的存储规则和存储模型,依据IEEE 754标准进行了详细阐述。
摘要由CSDN通过智能技术生成


一、数据类型的介绍

1.C语言提供的内置类型

char        //字符型
short       //短整型
int         //整型
long        //长整型
long long   //更长的整型
float       //单精度浮点型
double      //双精度浮点型

//其中:
//long在32位机器下是4个字节,在64位机器下是8个字节
//long long 是在C99中加入进来的

它们在内存中所占空间的大小
在这里插入图片描述
类型的意义

1.使用这个类型开辟的内存空间的大小(大小决定使用范围);
2.如何看待内存空间的视角;
解析:
比如int a这个语句,int 是整型,则向内存空间申请了4个字节的空间,并且默认存放进这段内存空间的数据是int型
float b ,则是向内存申请了4个字节的空间,并且默认存放进这段内存空间的数据是单精度浮点型;

类型的基本归类

整型家族
char
	signed char
	unsigned char

short
	unsigned short [int]
	signed short [int]

int
	unsigned int
	signed int

long
	unsigned long [int]
	signed long [int]

long long
	unsigned long long [int]
	signed long long [int]

字符型为什么属于整型家族?
字符本质上是ASCII码,所以也划分到整型家族

比较特殊的char类型
在我们平常编码中,如果不加 unsigned 我们默认short,int,long都是有符号整型,但char除外;
char分为3种类型:

char
unsigned char
signed char

char 到底是unsigned char 还是signed char ,标准是未定义的,这取决于编译器;

signed 与unsigned 的作用
在生活中,总是存在着不需要使用负数就能表示的值,比如身高,体重等等。
同样,也存在着需要使用负数表示的值,比如温度等。
使用unsigned 能明确表示这个数据不具有负数形式,且表示的值更大。
若想表达的数据具有负数,则需要使用signed;

int a = 10;
//int 是一个整型,占用4个内存空间,具有32个bit位
//0000 0000 0000 0000 0000 0000 0000 1010

有符号数最高位表示符号位,0表示正数,1表示负数;
无符号数最高一位仍是有效数据位;

浮点家族
float 
double

只要表示是小数就可以使用浮点数。
float的精度低,存储的数值范围要小;double的精度大,存储的数值范围要大;

2.构造类型(自定义类型)

数组类型
结构体类型 struct
枚举类型 enum
联合类型 union

数组类型

//数组类型:
//去掉数组名,就是它的类型
int arr1[5];   ---- int [5]
int arr2[8];   ---- int [8]
char ch[5];    ---- char [5]
//当数组的数据类型和元素大小发生变化时,数组的类型就会发生变化

3.指针类型

int* pi;
char* pc;
float* pf;
void* pv;

空类型:

void 表示空类型(无类型)
通常应用于函数的返回类型,函数的参数,指针类型。

//第一个void表示函数不会有返回值
//第二个void表明函数不需要传参 --- 如果还是进行了传参,也不会报错
void test(void)
{
   
	printf("hehe\n");
}
int main()
{
   
	test();
	return 0;
}

二、整型在内存中的存储

原码 、反码、补码

原码:直接通过正负的形式写出的二进制序列就是原码;
反码:原码的符号位不变,其他形式按位取反得到的就是反码;
补码:反码+1就是补码
正数的原码、反码、补码相同;
负数的原码、反码、补码需要通过计算得出;

int main()
{
   
	int a = 10;
	//0000 0000 0000 0000 0000 0000 0000 1010 - 原码
	//16进制表示:
	//0x00 00 00 00 0a
	//0000 0000 0000 0000 0000 0000 0000 1010 - 反码
	//0000 0000 0000 0000 0000 0000 0000 1010 - 补码
	
	
	int b = -10;
	//1000 0000 0000 0000 0000 0000 0000 1010 - 原码
	//0x80 00 00 0a
	//1111 1111 1111 1111 1111 1111 1111 0101 - 反码
	//0xff ff ff f5
	//1111 1111 1111 1111 1111 1111 1111 0110 - 补码
	//0xff ff ff f6
	return 0;
}

那么数据在内存中是怎么存储的呢?
在这里插入图片描述在这里插入图片描述
注意:
内存中存放的数据仍然是二进制的形式,只是我们在调试时,VS将二进制转化为更为简短的十六进制。
结论ÿ

  • 4
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值