目录
数据类型的介绍
在初识C语言文章中,介绍了基础数据类型,如:int、double、float、short、char等。
并且知道了数据类型的意义是什么:一是不同的类型开辟的内存空间大小不同。二是决定了看待该内存空间的视角。
类型的基本归类
我们可以将数据类型分为两类:一种是整型家族、一种是浮点型家族。
整型家族
char | unsigned char signed char |
int | unsigned int signed int |
long | unsigned long signed long |
short | unsigned short signed short |
这里将char型归为整型是因为字符型存储时存的是ASCII码值。
浮点型家族
double |
float |
构造类型
数组类型 | 数据类型 数组名【】 |
结构体类型 | struct |
枚举类型 | enum |
联合类型 | union |
这里将数组类型归为构造类型是因为不同的数组大小就是不同的类型。
指针类型
字符指针char* |
整型指针int* |
单精度浮点数指针float* |
双精度浮点数指针double* |
空类型指针void* |
短整型指针short* |
整型在内存中的存储
整形在内存中的存储是以补码形式。其原因是:使用补码可以将该数的符号位和数值位统一处理,同时加法和减法也可以统一处理(cpu只有加法器)此外原码和补码之间相互转换,其运算过程是相同的,不需要而外的硬件电路。
原码、反码、补码
计算机中的整型有三种二进制表示方法,分别是原码、反码、补码。这三种表示方法有一个共同点:都有符号位和数值位两部分。
对于符号位:用0表示整数,用1表示负数。
原码:将一个数翻译成二进制的表示形式就是源码
反码:将原码按位取反(符号位不变)后得到反码
补码:反码加一后得到补码,数据都是以补码形式存放在内存中。
对于正数:源码=反码=补码。
对于负数:三种表示方法各不相同。
图例
大/小端存储模式的介绍
大/小端存储模式的概念
大端存储模式:将一个数的高位存放在低地址处,将该数的低位存放在高地址处。
小端存储模式:将一个数的低位存放在低地址处,将该数的高位存放在高地址处。
(可以理解成,大端因为大,所以比较叛逆,数的高低位和地址的高低相反。
小端因为小,比较老实,数的高低位和地址的高低相匹配)
大/小端存储模式的意义
在计算机系统中,我们是以字节为单位,8bit位为一个字节,计算机中不只有char类型,还有short、int、long,另外,对于位数大于8bit位的处理器,例如16位处理器、32位处理器,由于寄存器的宽度大于一个字节,那么必然存在着一个如何将多个字节安排的问题,进而导致大/小端存储模式的出现
图例
浮点型在内存中的存储
浮点型在内存中的存储与整型在内存中的存储不同。
浮点型的存储规则:根据IEEE745,任意一个二进制浮点数可以表示为:(-1)^S*M*2^E
其中(-1)^S表示符号位,S=0表示整数,S=1表示负数。
M表示有效数值(1<=M<2)
2^E表示指数位。
单精度浮点数的存储图例
双精度浮点数的存储图例
IEEE745对有效数字M和指数E的一些特别规定
对于M
前面说过M要写成1.xxxxxxxxxxxxxxxxxxx(小数点后边的x表示小数),在计算机内部保存M时可以省略1,因为计算机默认M这个数的第一位总是1。这样可以节省一位有效数字。
对于E
首先E是一个无符号整数(unsigned int)这意味着E如果为8bit位(32位环境下),取值范围为0~255,如果为11bit位(在64位环境下)取值范围为0~2047。但是我们知道,科学计数法中的指数是会出现负数的例如10的-1次方,所以规定存入内存时,E必须要加上一个中间数(对于8bit位的E,中间数是127。对于11bit位的E,这个中间数是1023)
然后指数E从内存中取出时分为3种情况:
第一种:E不全为零或不全为一。此时浮点数就采取E-中间数,得到真实值,在将有效数字M前加上第一位1.
第二种:E全为零,此时E=1-中间数,并且此时的M不再在第一位上加上1,二是还原成0.xxx的小数,这样做是为了表示正负零以及接近于零很小的数字。
第三种:E全为1,此时如果有效数字M全为0,表示负无穷大或者正无穷大(取决于符号位)
总结
介绍了基本的数据类型,以及数据类型的意义。整型在内存中的存储,二进制的三种表示方式:原码、反码、补码。其中整数的原反补码相同,负数的原反补不同。原反补的转换规则。浮点型在内存中的存储以及IEEE754对有效数字M和指数E的一些特殊规定。大小端存储模式的区别以及意义。