(C语言)数据在内存中的存储

一、数据类型的介绍

char      short      int      long        long  long      float    double

☆类型的意义:

①使用这个类型开辟内存空间的大小。

②如何看待内存空间的视角。(比如可以看到是整型还是浮点型,从而知道它是如何存储的)

1、整型家族:

char                             //没有规定char是有符号的还是无符号的,这取决于编译器

    signed char

    unsigned char

short

    signed short

    unsigned short

int

    signed int

    unsigned int

long 

    signed long 

    unsigned long

2、浮点型家族

float 

fouble

3、构造类型

①数组类型

②结构体类型 struct

③枚举类型 enum

④联合类型 union

4、指针类型

int* pa

char* pa

float* pa

void* pa

5、空类型

void表示空类型(无类型)

通常应用于函数的返回类型、函数的参数、指针类型

如:函数返回类型  void  test();

函数参数  void test(void)     (无参数)

指针  void* p

二、整型在内存中的存储

1、数据在内存中以二进制的形式存储,而二进制有原码、反码、补码三种表现形式。

①一个整数在内存中是以补码的形式存放的

②原码(符号位不变,其他位按位取反)<==>反码(反码+1)<==>补码(符号位不变,其他位按位取反,取反后+1)-->原码

③补码在内存中存储的顺序分为,大端字节序和小段字节序

大端字节序:是指数据的低位保存在内存的高地址中,而数据的高位保存在内存的低地址中;

小端字节序:是指数据的低位保存在内存的低地址中,而数据的高位保存在内存的高地址中;

2、分析一些整型存储的代码:

#include<stdio.h>
//第一个代码
//int main()
//{
//	char a[1000];
//	for (int i = 0; i < 1000; i++)
//	{
//		a[i] = -1 - i;
//	}
//	printf("%d",strlen(a));
//	return 0;
//}
//第二个代码
//int main()
//{
//	unsigned int i;
//	for (i = 9; i >= 0; i--)
//	{
//		printf("%u\n",i);
//	}
//	return 0;
//}
//第三个代码
//int main()
//{
//	char a = -1;
//	signed char b = -1;
//	unsigned charc = -1;
//	printf("a=%d,b=%d,c=%d",a,b,c);
//	return 0;
//}
//第四个代码
//int main()
//{
//	char a = -128;
//	printf("%u\n",a);
//	return 0;
//}
//第五个代码
//int main()
//{
//	char a = 128;
//	printf("%u\n",a);
//	return 0;
//}
//第六个代码
//int main()
//{
//	int i = -20;
//	unsigned int j = 10;
//	printf("%d\n",i+j);
//	return 0;
//}
//第七个代码
//unsigned char i = 0;
//int main()
//{
//	for (i = 0; i <= 255; i++)
//	{
//		printf("hello world\n");
//	}
//	return 0;
//}

三、浮点型在内存中的存储

浮点数表示的范围在<float.h>中

整型表示的范围在<limits.h>中

1、浮点数和整数在内存中存储和取出的方式是不相同的。

2、浮点数的存储

根据国际标准IEEE754,任意一个二进制浮点数V都可以表示成下面的形式:

(-1)^S*M*2^E

其中,(-1)^S表示符号位,当S=0,V为正数;当S=1,V为负数。

M表示有效数字,大于等于1,小于2

2^E表示指数位

①float:对32位的浮点数,最高的1位是符号位S,接着的8位是指数E,剩下的23位为有效数字M

②double:对64位的浮点数,最高的1位是符号位S,接着的11位是指数E,剩下的52位为有效数字M

③IEEE754对有效数字M和指数E,还有一些特别的规定

存入内存时:

<1>对有效数字M:

因为1=<M<2,所以M可以写成1.xxxxxxxxxx的形式,其中xxxxxxxxx表示小数。IEEE754规定,在计算机内部保存M时,默认这个数的第一位总是1,因此可以被舍弃,只保存后面的xxxxxxxx部分。等到读取的时候再把第一位的1加上去,这样做的目的是可以节省1位有效数字,即32位的浮点数值留给M了23位,将1舍弃后就可以保存24位有效数字。

<2>对指数E 

E是一个无符号整数,也就是说,如果E是8位的,那么它的取值范围为0~255。如果E为11位的,那么它的取值范围为0~2047。但是科学计数法中的E是可以出现负数的,所以IEEE754规定,存入内存时E的真实值必须再加上一个中间数,对于8位的E,这个中间数是127;对于11位的E,这个中间数是1023。

从内存中取出时:

<3>对指数E

1)E不全为0、不全为1

指数E的计算值减去127(或1023),得到真实值,再将有效数字M前加上第一位的1。

2)E全为0

这种情况下,浮点数的指数E等于1-127(或1-1023)为真实值,有效数字M不再加上第一位的1,而是还原为0.xxxxxxxxxxx的小数。这样做是为了表示±0,以及接近于0的很小的数字。

3)E全为1

这时,如果有效数字M全为0,表示±无穷大(正负取决于符号位S)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不会算法的笨小孩

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值