|
1、类型的归类
整型家族:char、unsigned char、signed char //对于char来说,标准里并不默认其为有符号还是无符号的,这个结果取决于编译器
short ( signed short [int] )、unsigned short [int]
int ( signed int )、unsigned int
long ( signed long [int] )、unsigned long [int]
浮点数家族:float
double
构造类型:数组类型
结构体类型 struct
枚举类型 enum
联合类型 union
指针类型
空类型
2、整型在内存中的存储
1)整型在内存中以补码的形式存储。
原因有三:其一,使用补码可以将符号位和数值域统一处理;其二,加法和减法可以统一处理(cpu只有加法器);其三,补码与原码相互转换,其运算过程是相同的,不需要额外的硬件电路。
2)数据存储的大小端模式
小端字节序存储:数据的低字节存到低地址处,高字节存到高地址处。
大端字节序存储:数据的低字节存到高地址处,高字节存到低地址处。
存在不同字节序存储模式的原因:因为在计算机系统中是以字节做单位的,每个地址单元对应一个字节,一个字节有8个比特位。不过在c语言中,除了具有一个字节(8b)的char类型外,还有2个字节(16b)的short型、4个字节(32b)的int型等,而且对于位数大于8的处理器,由于寄存器宽度大于一个字节,所以就必然存在如何安排多个字节的问题。这就是小端存储模式与大端存储模式出现的原因。
例如对于一个short类型的x数据,在内存中的地址为0x0010,其值为0x1122,那么0x11是x的高字节,0x22是x的低字节。对于大端存储模式,0x11放在低地址的0x0010中,0x22放在高地址的0x0011中。对于小端存储模式则相反。
3、浮点数在内存中的存储
1)根据国际标准IEEE754,任意一个二进制浮点数V可以表示为下面的形式:
(-1)^S*M*2^E
(-1)^S表示符号位,当S=0时,V为正数;当S=1时,V为负数
M表示有效数字,大于等于1,小于2
2^E表示指数位
2)对于32位的浮点数和64位浮点数的不同规定
对于32位的浮点数,最高1位是符号位S,接着是8位的指数E,剩下的23位是有效数字M。
对于64位的浮点数,最高1位是符号位S,接着的11位是指数E,剩下的52位是有效数字M。
3)几点注意
第一,对于有效数字M,因为其值大于等于1而小于2,所以在计算机中,为了能够利用23位(52位)表示更多的数据,IEEE754规定保存M时默认这个数的第一位为1,所以只保存后面的部分(小数点后的位)。然后等到读取此数的时候,再把第一位的1加上去。
第二,对于指数E,为了能够表示负数的指数,IEEE754规定,存入内存时E的真实值必须再加上一个中间数,对于8位的E,这个中间数为127;对于11位的E,这个中间数是1023。
第三,当E全为0时,读取该数字时有效数字M不再加上第一位的1,因为这是一个无限接近与0的数字,表示正负0;当E全为1的时候,若M全为0,则表示一个正负无穷大的数。 |