概述
目录
一、数据类型
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位时+127,11位时+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编译器是小端存储,对于其他编译器有兴趣的同学可以下来自己验证一下
以上便是今天所讲的数据的存储相关内容啦,下篇博客再见!!
最后
以上就是害怕冰棍为你收集整理的C语言之数据的存储一、数据类型二、整型在内存中的存储 三、浮点数在内存中的存储 四、大小端字节序存储的全部内容,希望文章能够帮你解决C语言之数据的存储一、数据类型二、整型在内存中的存储 三、浮点数在内存中的存储 四、大小端字节序存储所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复