C语言之数据的存储

目录

一、数据类型

1、整型家族

2、浮点数家族

 3、构造类型

(1)、数组类型:

(2)、结构体类型:

(3)、枚举类型:

(4)、联合类型:

 4、指针类型

 5、空类型

二、整型在内存中的存储

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

1、浮点数的存储规则

2、浮点数对于S、M、E这三个数值的存储

3、将指数E取出内存的三种情况

(1)E不全为0或不全为1的情况

(2)E全为0的情况

(3)E全为1情况

 四、大小端字节序存储



一、数据类型

经过前面的学习,我们了解了C语言中数据的类型大致有:

char,  short , int  ,long  , long long , float , double  这些类型

具体的请看我前面所发布的初识C语言之数据类型呀!

可以分为以下几种类型:

1、整型家族

其中包含了char,short,int,long这几种类型,在这几种类型下,都分为两种——有符号的和无符号的。

其中有符号的,表示为:signed ...

无符号的表示为:unsigned...

比如说有符号整型则为:signed int,无符号短整型:unsigned short [int](int可写可不写)

当然有些细心的同学就会发现,为什么整型家族中会有char类型的数据呢?

其实char虽然是字符型,但是char类型在电脑中存储的识它的Ascii码值,而Ascii码值是整数,所以自然而然将char类型包含在整型家族中了!

注意注意,如果是有符号位的数据,最高位是符号位,其中最高位若是0表示正数,而最高位若是1表示负数

如果是无符号的数据,则最高位也为数据位,并无0/1的正负之分

只需记住上面几点即可啦


2、浮点数家族

称为浮点数家族,那么这个家族成员自然就是float和double类型啦

其中大家很清楚,float单精度浮点型,而double双精度浮点型

这一个家族很简单,我们很了解,那么便快马加鞭的进入下一个家族吧


 3、构造类型

构造类型也称为自定义类型

分为以下四类,分别是:数组类型,结构体类型,枚举类型,联合类型

接下来具体说说这几种类型

(1)、数组类型

为什么说数组类型是自定义类型呢,原因很简单,举个例子大家便懂其中的缘故了

比如说:int arr[10],创建了这样一个数组,那么去掉数组名arr,剩下的int [10],便是类型了,再比如char p[20],去掉数组名p,剩下的char [20],就是类型,所以在创建数组时,类型非常多并且都是根据自己的需求创建的,所以数组类型自然而然被称为构造类型也叫自定义类型啦! 

(2)、结构体类型

结构体有关键字struct,结构体便是创建一个名称,然后在其中创建成员,并且成员可以自行赋值,例如定义一个结构体Student,便可以在其中设置姓名:char name[20],年龄:int age,学号:char id[20]等等,自然也能被称为构造类型!

~~~~有关结构体的具体内容,近期就会发布一篇博客分享其中的知识啦

(3)、枚举类型:

枚举类型的关键字为:enum,其中具体的讲解我在前面的博客——初识C语言之关键字中有详细的讲解,以及如何运用,请大家关注我前面的博客呀

(4)、联合类型:

联合类型的关键字为:union,这个类型大家知道有它就好,不用过多了解,如果有感兴趣的同学可以网上查阅资料,增加知识


 4、指针类型

指针类型大致有以下几种,大家应该都耳熟能详了

int* p,char* p,float* p,void* p

唯一需要注意的是最后一个空类型指针,是我们没有见过的,了解即可


 5、空类型

void表示空类型(无类型

这个通常应用于函数的返回类型函数的参数,还有上面所说的指针类型,等等


二、整型在内存中的存储

说起在内存中的存储,首先就应该明白原码,反码,补码这三个概念

原码:

直接将数值按照正负数的形式翻译成二进制就ok了

反码:

将原码的符号位不变,其他位依次按位取反

补码:

反码+1得到补码

注意注意:内存中存储的是数据的补码呦!!

这三种表示均有符号位和数值位,符号位:0表示正,1表示负

对于正数来说,原码,反码,补码相同

例如:int a = 1;a的符号位为正,那么a的最高位是0

则a的原码为:00000000 00000000 00000000 00000001,自然正数a的反码,补码自然也是这个

这里注意啦:因为a是整型,所以占四个字节,32个比特位,故原码是32个0、1组成的二进制序列。

对于负数来说,才满足上方所说的原码,反码,补码的相互转换,举个例子吧

int b = -1;b的符号位为负,那么b的最高位是1

则b的原码为:10000000 00000000 00000000 00000001

b的反码为:    11111111 111111111 11111111 11111110(符号位不变,其他位按位取反)

b的补码为:    11111111 111111111 11111111 11111111(反码+1)

由此可知,b在内存中存储的便是b的补码:11111111 111111111 11111111 11111111

整型在内存中的存储知识到此结束!


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

1、浮点数的存储规则

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

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

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

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

2^E表示指数位

下面举个例子具体说明一下这三个值吧吧

9.0写成二进制形式为:1001.0

1001.0=(-1)^0 * 1.001* 2^3

即S=0,M=1.001,E=3,大家根据这个例子能更深入地了解了吧!

2、浮点数对于S、M、E这三个数值的存储

标准规定:

对于32位的浮点数(单精度浮点数:float),最高的1位符号位S,接着8位指数E,剩下的23位有效数字M

对于64位的浮点数(双精度浮点数:double),最高的1位符号位S,接着11位指数E,剩下的52位有效数字M

注意注意:有效数字M存储时,1可省略,因为M前面必为1,省略后存储时可多存储一位

指数E比较复杂,首先E是一个无符号整数,8位时的取值范围是:0~255,11位时的取值范围是:0~2047,但是E有可能出现负数,则标准规定:存入E时加上一个中间数,8位时+12711位时+1023。

下面给大家举个例子。

float f = 5.5;

5.5转换成二进制是101.1,则101.1=(-1)^0 * 1.011 * 2^2

S=0,M=1.011,E=2+127=129

那么存储到内存中:

二进制为:0 10000001 01100000000000000000000

转换16进制为:0x 40 b0 00 00

3、将指数E取出内存的三种情况

(1)E不全为0或不全为1的情况

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

(2)E全为0的情况

浮点数的指数E等于1-127(或1-1023)即为真实值,M不再加第一位的1,而是还原为0.xxxx的小数,表示正负0,以及接近0的极小的数字

(3)E全为1情况

表示正负无穷大(正负取决于符号位S)

注意注意:大家主要要懂第一种情况,第二三种情况了解即可


 四、大小端字节序存储

说起大小端字节序存储,大家可能听过这个概念,那么接下来,大家先了解一下大小端字节序存储的基本概念吧

大端字节序存储:

把一个数据低位字节处的数据存放在高地址处,高位字节处的数据存放在低地址处

小端字节序存储:

把一个数据低位字节处的数据存放在低地址处,高位字节处的数据存放在高地址处

下面我对概念加以说明

例如:我创建一个整型a,以16进制的形式进行表示

int a = 0x11 22 33 44;这里的0x是16进制的标志,11处于最高位,而44则处于最低位

那么比如说内存中从左至右,地址是由低地址到高地址的,如图所示:

下面这张图便表示的是大端字节序存储

 下面这张图表示的是小端字节序存储

 

 经过验证,证明了我们平常所用的VS编译器是小端存储,对于其他编译器有兴趣的同学可以下来自己验证一下


以上便是今天所讲的数据的存储相关内容啦,下篇博客再见!!

猜你喜欢

转载自blog.csdn.net/m0_64411530/article/details/123720764