数据在内存中的存储
首先,要知道数据在是以二进制的方式存储,并且存储的是补码。
1.整数在内存中的存储
在32位操作系统中,
int(signed int)类型占四个字节,表示范围为-2147483648~2147483647。
unsigned int类型占四个字节,表示范围为0~4294967295。
char(signed char)类型占一个字节,表示范围为-128~127。
unsigned char类型占一个字节,表示范围为0~255。
注意:
char类型本质上存储的是ASCII码值,所以也归类到整数里。
2.浮点数在内存中的存储
根据国际标准IEEE(电气和电子工程协会) 754,任意⼀个二进制浮点数V可以表示成下面的形式:
V = (−1)^S * M * 2^E
(−1)^S:表示符号位,当S=0,V为正数;当S=1,V为负数。
M:表示有效数字,M是大于等于1,小于2的。
2^E:表示指数位。
那么我们只需要存储S,M,E的值就可以还原出浮点数的值。
在C语言中, S,M,E的值是这样存放的:
从它们的存储差异就可以看出,double类型(双精度浮点数)的精确度要大于float类型(单精度浮点数) 。
2.1浮点数存储存在的问题
由于浮点数存在存储精度,所以他对于有些小数可以精确存储,而对于有些小数确不能精确存储。
例如:
#include <stdio.h>
int main()
{
float a = 97.1f;
printf("%f", a);
return 0;
}
可以看到97.1并非精确的存储在a中,如果之后的再出现类似这样的语句
if(a == 97.1)
{
;
}
很有可能出现问题,所以应该尽量避免浮点数和小数直接比较,其结果可能是难以预期的。