数据在内存中的存储(浮点数等)

1.数据类型的介绍

基本的内置类型:

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

c语言没有字符串类型

类型的意义:

1.使用这个类型开辟内存空间的大小(大小决定了使用范围)

2.如何看待内存空间的视角(类型的不同,看待内存空间视角也不同)

1.1

整形家族:char(unsigned char,signed char)

short(unsigned short,signed short)

int(unsigned int,signed int)

long(unsigned long,signed long)

浮点型家族:

float

double

构造类型:

数组类型,结构体类型(struct),枚举类型,联合类型

指针类型:

int*  p;

char*  p;

float*  p;

void*  p;

空类型:

void表示空类型(无类型)

通常用于函数的返回类型,函数的参数,指针类型。

指针类型不同的影响:

int类型的指针修改4个字节的数字。

char类型的指针修改1个字节的数字。

2.整形在内存中的存储

一个变量的创建是要在内存中开辟空间的。空间大小是根据不同的类型而决定的。

int a=0;
int b=1;

我们指的a分配四个字节的空间。

那是如何存储的呢。

下面我们来了解一些概念:

2.1原码,反码,补码

计算机中的整数有2进制表示方法,即原码,反码,补码。

三种表示方法均有符号位和数值位;两部分,符号位是用0表示‘正’,‘1’表示负数。

而数值位,正数的原码,反码,补码均相同。

负数的三种表示方法均不同。

对于整数来说:数据存放内存中其实存放的是补码

2.2 大小端的介绍

大端存储:将数据的低地址存储到内存的高地址处。数据的高地址存储到低地址处。

小段存储:将数据的低地址存储到内存的低地址处。数据的高地址存储到高地址处。

#include<stdio.h>
int jiance()
{
int i=1;
return (*(char*)&i);
}
int main()
{
int ret=jiance();
if(ret==1)
printf("小端");
else
printf("大端");
return 0;
}

可以通过上述代码测是大端还是小端存储。

3.浮点型在内存中的存储

常见浮点数:

3.12159

1E10

浮点数家族包括:float,double,long double

3.1一个浮点数存储的例子

int n=9;
float *p=(float*)&n;                 
printf("n的值=&d ",n);              9
printf("*p的值=%f",*p);             0.000000


*p=9.0;
printf("n的值为=%d",n);             1091567616
printf("*p的值为=%f",*p);           9.000000

3.2浮点数存储规则

根据国际标准:任意一个二进制浮点数V可以写成以下形式

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

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

M表示有效数字,1<=M<2.

2^E表示指数位。

 举例来说:

十进制的5,写成二进制是101.0(浮点数),相当于1.01x2^2。

那么按照上面的格式,可以得出,S=0;M=1.01;E=2。

十进制的-5,写成二进制-101.0,相当于-1.01x2^2。那么,S=1;M=1.01;E=2。

按照国际规定:

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

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

前面说过M的取值规定,M可以写成1.xxxxxx的形式,所以计算机内部保存M时,默认这个数的第一位数位1,因此可以省去,等到读取的时候,系统会自动加上1。将1舍去以后,M可以保存24位有效数字。

至于指数E,情况就比较复杂

首先,E作为一个无符号整数

这意味着,如果E位8位,它的取值范围为0~255,如果E位11位,它的取值范围为0~2047.,但是我们知道科学计数法中的E是可以出现负数的,所以,国际规定,存入内存中E的真实值必须再加上一个中间数,对于8位的E,这个中间数是127,对于11位的E,这个中间数是1023。比如,2^10的E是10,所以保存成32位浮点数,必须保存10+127=137,即10001001。

然后,指数E从内存中取出,还可以分为3种情况:

E不全为0或不全为1

比如0.5,需要存储,二进制形式为0.1,由于规定正数部分必须为1,需要将小数点右移一位,则为1.0*2^(-1),其E为-1+127=126,表示为01111110

表示成 0 01111110 00000000000000000000000

E全为0

这时,浮点数的指数E等于1-127(或者1-1023)即为真实值。

有效数字M不再加上第一位的1,而是还原为0.xxxxx的小数。这样做是为了表示+-0,以及接近于0的很小的数字。

E全为1

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

相信大家看完文章,那道例题也会做了吧

有疑问的小伙伴也可以评论或者私信我

下次再见芜湖!!!!

猜你喜欢

转载自blog.csdn.net/cnjdd/article/details/131452791
今日推荐