C语言学习【C语言基本数据类型二】
_Bool类型
C99
标准添加了_Bool类型
,用于表示布尔值,即逻辑值true
和false
,原则上仅占用1
位存储空间;
float、double和long double
记数法示例
C
标准规定,float
类型必须至少能表示6
位有效数字,且取值范围至少是
1
0
−
37
1
0
+
37
10^{-37} ~ 10^{+37}
10−37 10+37,通常,系统存储一个浮点数要占用32
位;其中8
位用于表示指数的值和符号,剩下24
位用于表示非指数部分(也叫作尾数或有效数)及其符号。
C
语言提供的另一种浮点类型为double
(意为双精度),double
类型和float
类型的最小取值范围相同,但至少必须能表示10
位有效数字,一般情况下,double
占用64
位;
C
语言的第3中浮点类型是long double
,以满足比double
类型更高的精度要求;
声明浮点型变量
float noah, jonah;
double trouble;
float planck = 6.63e-34;
long double gnp;
浮点型常量
浮点型常量的基本形式是:有符号的数字(包括小数点),后面紧跟e
或者E
,最后是一个有符号数表示10
的指数:
-1.56E+12
2.87e-3
正好可以省略,可以么有小数点(如,2E5
)或指数部分(如,19.28
),但是不能同时省略两者:
3.14159
.2
4e16
.8E-5
100.
不要在浮点型常量中间加空格:1.56 E+12
这种写法错误;
通常,编译器假定浮点型常量是double
类型的精度,在浮点数后面加上f
或F
后最可覆盖默认设置,使用l
或L
后缀使得数字成为long double
类型;
C99
标准可以用十六进制表示浮点型常量,在十六进制数前加上十六进制前缀(0x
或0X
),用p
和P
分别代替e
和E
,用2
的幂代替10
的幂,例如0xa.1fp10
,十六进制a
等同于十进制10
,.1f
是1/16
加上15/256
,p10
是
2
10
2^{10}
210或1024
,
0xa.1fp10
表示的值是(10 + 1/16 + 15/256)X1024
,即十进制10346.0
;
打印浮点值
/* 以两种方式显示float类型的值 */
#include "stdio.h"
int main(void)
{
float aboat = 32000.0;
double abet = 2.14e9;
long double dip = 5.32e-5;
printf("%f can be written %e\n", aboat, aboat);
/* 编译器支持C99 或其中的相关特性 */
printf("And it's %a in hexadecimal, power of 2 notation\n", aboat);
printf("%f can be written %e\n", abet, abet);
printf("%Lf can be written %Le\n", dip, dip);
return 0;
}
程序输出结果
32000.000000 can be written 3.200000e+004
/* 编译器不支持C99 */
And it's 0x1.f40000p+14 in hexadecimal, power of 2 notation
2140000000.000000 can be written 2.140000e+009
0.000000 can be written 3.172882e-317
浮点值的上溢和下溢
/* 浮点值的上溢和下溢 */
#include "stdio.h"
int main(void)
{
float toobig = 3.4E38 * 100.0f;
printf("%e\n", toobig);
}
输出结果
1.#INF00e+000
上述程序为一个上溢(overflow)
的示例,C语言规定,在这种情况放下给toobig
赋值一个表示无穷大
的值;
/* 浮点数舍入错误 */
#include "stdio.h"
int main(void)
{
/* float 类型变量智能存储按指数比例缩小或方法的6或7位有效数字 */
float a,b;
b = 2.0e20 + 1.0;
a = b - 2.0e20;
printf("%f \n", a);
return 0;
}
程序运行结果
4008175468544.000000
显而易见,结果是错误的,float
缺少左右的小数位来完成正确的运算.