7.1 整数类型
7.1.1 C99中的整数类型
C99提供了两个额外的标准整数类型:long long int和unsigned long long int。
C99中把short int、int、long int和long long int类型(以及signed char类型)称为标准有符号整型,而把unsigned short int、unsigned int、unsigned long int和unsigned long long int类型(以及unsigned char类型和_Bool类型)称为标准无符号整型。
7.1.2 整数常量
7.1.3 C99中的整数常量
在C99中,以LL或ll(两个字母大小写要一致)结尾的整数常量是long long int型的。如果在LL或ll的前面或后面增加字母U(或u),则该整数常量为unsigned long long int型。
7.1.4 整数溢出
有符号整数运算中发生溢出时,程序的行为是未定义的。
无符号整数运算过程中发生溢出时,结果是有定义的:正确答案对2的n次幂取模,其中n是用于存储结果的位数。例如,如果对无符号的16位数65535加1,其结果可以保证为0。
7.2 浮点类型
在C99中,浮点类型分为两种:一种是实浮点类型,包括float、double和long double类型;另一种是C99新增的复数类型(包括float _Complex、double _Complex和long double _Complex)。
7.2.2 读/写浮点数
读取double类型的值时,在e、f或g前放置字母l;
读写long double类型的值时,在e、f或g前放置字母L;
7.3 字符类型
由于字符和整数之间有密切关系,C89采用术语整值类型(integral type)来(统称)包含整数类型和字符类型。枚举类型也属于整值类型。
C99不使用术语“整值类型”,而是扩展了整数类型的含义使其包含字符类型和枚举类型。C99中的_Bool型是无符号整数类型。
7.3.3 算术类型
整数类型和浮点类型统称为算术类型。下面对C89中的算术类型进行了总结分类:
- 整值类型:
- 字符数型(char);
- 有符号整型(signed char、short int、int、long int);
- 无符号整型(unsigned char、unsigned short int、unsigned int、unsigned long int);
- 枚举类型。
- 浮点类型(float、double、long double)。
C99的算术类型具有更复杂的层次:
- 整数类型:
- 字符类型(char);
- 有符号整型, 包括标准的(signed char、short int、int、long int、long long int)和扩展的;
- 无符号整型,包括标准的(unsigned char、unsigned short int、unsigned int、unsigned long int、unsigned long long int、_Bool)和扩展的;
- 枚举类型。
- 浮点类型:
- 实数浮点类型(float、double、long double);
- 复数类型(float_Complex、double_Complex、long double_Complex)。
7.3.4 转义序列
转义序列共有两种:字符转义序列(character escape)和数字转义序列(numeric escape)。
字符转义序列使用起来很容易,但是它们有一个问题:转义序列列表没有包含所有无法打印的ASCII字符,只包含了最常用的字符。
字符转义序列也无法用于表示基本的128个ASCII字符以外的字符。数字转义序列可以表示任何字符,所以它可以解决上述问题。
7.3.4.1 数字转义序列
为了把特殊字符书写成数字转义序列,首先需要在类似附录E那样的表中查找字符的八进制或十六进制值。
八进制转义序列:由字符\和跟随其后的一个最多含有三位数字的八进制数组成。(此数必须表示为无符号字符,所以最大值通常是八进制的377。)例如,可以将转义字符写成\33或\033。跟八进制常量不同,转义序列中的八进制数不一定要用0开头。
十六进制转义序列:由\x和跟随其后的一个十六进制数组成。虽然标准C对于十六进制数的位数没有限制,但其必须表示成无符号字符(因此,如果字符长度是8位,那么十六进制数的值不能超过FF)。若采用这种表示法,可以把转义字符写成\x1b或\x1B的形式。字符x必须小写,但是十六进制的数字(例如b)不限大小写。
7.3.5 字符处理函数
#include <stdio.h>
#include <ctype.h>
int main(){
int i = 'a';
i = toupper(i);
printf("%c\n",i);
}
7.3.6 用scanf和printf读/写字符
7.3.7 用getchar和putchar读/写字符
getchar函数返回的是一个int类型的值而不是char类型的值
7.4 类型转换
7.5 类型定义
typedef int Bool;
注意,所定义的类型的名字放在最后。