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缺少左右的小数位来完成正确的运算.







![[Kubernetes] sealos 部署 K8s v1.25.0 集群](https://img-blog.csdnimg.cn/direct/485bb6dbead64719a9f011cbf56d07df.png)











