五、数据类型(3):浮点数与字符
1、浮点类型:double和float,它们是什么,如何输入输出?
2、浮点的范围和精度:浮点数能表示哪些数?
输出精度5
在%和f之间加上.n可以指定输出小数点后几位,这样的输出是做4舍5入的
printf("%.3f\n",-0.0049);
printf("%.30f\n",-0.0049);
printf("%.3f\n",-0.00049);
超过范围的浮点数
(1)printf 输出 inf 表示超过范围的浮点数:正负无穷大
(2)printf 输出 nan 表示不存在的浮点数
浮点运算的精度
(1)带小数点的字面量是 double 而非 float
(2)float 需要用 f 或 F后缀来表明身份
浮点数的内部表达
选择浮点类型
(1)如果没有特殊需要,只使用double
(2)现代CPU能直接对double 做硬件运算,性能不会比float 差,在64位的机器上,数据存储的速度也不比float 慢。
3、字符类型:char是整数也是字符
(1)用单引号表示的字符字面量
'a' '1'
(2)''也是一个字符
(3)printf 和scanf 里用%c来输入输出字符
字符的输入输出
——如何输入‘1’这个字符给 char c ?
scanf("%c",&c); //——> 1
scanf("%d",&i); c=i; //——> 49
——‘1’的ASCII编码是49,所以当c==49时,它代表‘1’
printf("%i %c\n",c,c);
混合输入
——有何不同?
scanf("%d %c",&i,&c);
scanf("%d%c",&i,&c);
字符计算
(1)一个字符加一个数字得到ASCII码表中那个数之后的字符
char c='A'; c++; printf("%c\n",c);
(2)两个字符的减,得到它们在表中的距离
int i='Z'-'A'; printf("%d\n",i);
大小写转换
(1)字母在ASCII表中是顺序排列的。
(2)大写字母和小写字母是分开排列的。
(3)‘a’-'A'可以得到两段之间的距离,于是
a+'a'-'A' //可以把一个大写字母变成小写字母
a+'A'-'a' //可以把一个小写字母变成大写字母
4、逃逸字符:反斜杠开头的字符是特殊的控制字符
——用来表达无法印出来的控制字符或特殊字
逻辑类型
#include<stdbool.h>
之后就可以使用 bool 和 true、flase
bool的运算
(1)bool 实际上还是以int的手段实现的,所以可以当作int来计算。
(2)也只能当作int 来输入输出
5、类型转换:如何在不同类型之间做转换?
自动类型转换
——当运算符的两边出现不一致的类型时,会自动转换成较大的类型。
(1)大的意思是能表达的数的范围更大
(2)
char ——> short ——> int ——> long ——>long long
(3)
int ——> float ——> double
——对于printf ,任何小于int的类型会被转换成Int;float会被转换成double
——但是scanf不会,要输入short,需要%hd
强制类型转换
——要把一个量强制转换成另一个类型(通常是较小的类型),需要:
(类型) 值
(int)10.2
(short)32
——注意这时候的安全性,小的变量不总能表达大的量
(short)32768
只是从那个变量计算出了一个新类型的值,它并不改变那个变量,无论是值还是类型都不改变。
double a=1.0; double b=2.0; int i=(int) a/b;
——强制类型转换的优先级高于四则运算
int a=5; int b=6; double d=(double)(a/b);