一、_Bool类型
_Bool类型由C99引入
_Bool类型用于表示布尔值:逻辑值true(真)和false(假)
C用值1表示true,用值0表示false,所以_Bool类型本质上也是一种整数类型
二、float、double和long double
计数法:
数字 | 科学计数法 | 指数计数法 |
C语言中的浮点数表示类似于科学计数法
C标准规定,float类型必须至少能表示6位有效数值,取值范围至少为到
通常系统使用32位存储一个浮点数,其中8位用于表示指数及其符号,24位用于表示非指数部分(称为尾数或有效数字)及其符号
double(双精度)类型:和float类型具有相同的最小取值范围要求,但必须至少能表示10位有效数字
一般地,double使用64位长度,一些系统将多出的32位全部用于尾数部分,以增加数值的精度,一些系统将其中的一些位分配给指数部分,以容纳更大的指数,增加可以表示的数的范围
long double:可以满足比double类型更高的精度要求
1. 浮点变量声明
float a;
float b = 3.14e-6;
2. 浮点常量
-1.56E+12
2.8e-5
表示浮点常量时中间不要使用空格
默认情况下,编译器将浮点常量当做double类型,例:
some = 4.0 * 3.0
4.0和3.0被存储为double类型,通常使用64位进行存储,乘积运算使用双精度,结果被截取为正常的float类型
C中可以通过f或F后缀使编译器把浮点常量当做float类型,如2.4f和5.5F
C中可以通过l或L后缀使编译器把浮点常量当做long double类型,如3.2l和8.1e3L
没有后缀的浮点常量为double类型
C99位浮点常量新添加一种十六进制格式:
0xa.1fp10
a是10,.1f表示1/16+15/256,p10表示,整个数的十进制值为10364.0
3. 浮点值打印
printf()函数使用%f格式说明符打印十进制计数法的float和double数字,用%e打印指数计数法的数字;打印long double类型需要%Lf、%Le说明符
示例:
#include <stdio.h>
int main(void)
{
float a = 32000.0;
double float b = 3.11e8;
long double float c = 5.2e-6;
printf("%f can be written as %e\n", a, a);
printf("%f can be written as %e\n", b, b);
printf("%f can be written as %e\n", c, c);
return 0;
}
运行结果:
4. 浮点值的上溢和下溢
上溢:计算结果是一个大得不能表达的数时,会发生上溢
下溢:对于一个能用对浮点值可用的全部精度进行表示的最小数字进行除法运算,会导致尾数部分右移,损失有效数字,得到一个低于正常的值,该过程称为下溢
NaN(Not-a-Number):一个特殊的浮点值
示例:浮点数舍入误差
#include <stdio.h>
int main(void)
{
float a, b;
float c, d;
b = 2.0e20 + 1.0;
a = b - 2.0e20;
d = 2.0e6 + 1.0;
c = d - 2.0e6;
printf("%f \n", a);
printf("%f \n", c);
return 0;
}
运行结果:
原因:计算机缺乏足够的进行正确运算所需的十进制位数
三、复数和虚数
3种复数类型:float_Complex、double_Complex、long double_Complex;float_Complex变量包含两个float值,一个表示复数的实部,另一个表示复数的虚部
3种虚数类型:float_Imaginary、double_Imaginary、long double_Imaginary
四、其他类型
C没有字符串类型,但是仍然可以很好地处理字符串
C从基本类型中衍生出其他类型:数组、指针、结构、联合