c语言整型与浮点型数据存取的范围
整型数据:
1.long int 的由来
在win32及现在现在系统中,长度为4;在历史上,或者其他某些系统中,int长度为2,是short int。
所以: short<=int<=long
测试类型数据的字节数函数:sizeof(类型名称)
printf("%d",sizeof(int));
这里列举在win64下的类型字节数及取值范围
类型名称 | 字节数 | 取值范围 |
---|---|---|
short (short int) | 2 | (-2 ^15)~ (2^15-1)-32768~+32767 |
unsigned short | 2 | 0~65535 |
int | 4 | (-2 ^31)~ (2^31-1)-2147483648~ +2147483647 |
unsigned int | 4 | 0~4294967295 |
long (long int) | 4 | (-2 ^31)~ (2^31-1) -2147483648~+2141483647 |
unsigned long | 4 | 0~4294967295 |
long long (long long long int) | 8 | (-2 ^63)~ (2^63-1)-9223372036854775808~+9223372036854775807 |
unsigned long long | 8 | 0~18446744073709551615 |
浮点型数据:
取值范围(看指数部分):
float的指数部分有 8bit (2^8),由于是有符号型,所以得到对应的指数范围-128~128。
取值范围为:
(-2 ^128)~ (2^128),约等于-3.4E38 ~ +3.4E38 ;
double的指数部分有 11bit(2^11) , 对应的指数范围-1024~1024。
取值范围为:
(-2 ^1024)~ (2^1024),约 等于-1.797E308 ~ +1.797E308;
精度( 有效数字)(主要看尾数位):
float的尾数位是23bit,对应7~8位十进制数,所以有效数字有的编译器是7位,也有的是8位;
double的尾数位是52bit,对应15~16位十进制数,有效数字位15位或16位。
类型名称 | 指数位 | 尾数位 | 取值范围 | 有效数字 |
---|---|---|---|---|
float | 8 | 23 | (-2 ^128)~ (2^128) 约等于-3.4E38 ~ +3.4E38 | 7 或 8位 |
double | 11 | 52 | (-2 ^1024)~ (2^1024) 约等于-1.797E308 ~ +1.797E308 | 15 或 16位 |
double的存取的错误认知
double类型可以存307位(实际是308,但存的最大的最高位为1,所以基本默认这里就讲307),
但当用.f 输出double时, 它的精度在前16位,他只能保证前16位的精度,后面的就无法保证,因为一旦超过精度范围,就不能精确的描述该数据,不同的处理器对不能精确描述的部分的处理机制可能是不同的,这也就导致了在不同的平台上为什么一套代码的运行结果会不一致
注意:
printf()用%f输出double型,而scanf却用%lf
严格地讲,%lf在printf下是未定义的,但是很多系统可能会接受它。
要确保可移植性,就要坚持使用%f