C语言提供了char、int、float和double这四个基本的算术类型说明,以及signed、unsigned、short和long这几个修饰词。以下是典型的数据位长和范围。编译器可能使用不同的数据位长和范围。请参考具体的参考。
在标准头文件limits.h 和 float.h中说明了基础数据的长度。float,double和long double的范围就是在IEEE 754标准中提及的典型数据。另外,C99添加了新的复数类型,C11添加了原子类型,它们不在本条目讨论范围内。
关键字 | 字节(字节) | 范围 | 格式化字符串 | 硬件层面的类型 | 备注 |
---|---|---|---|---|---|
char | 1bytes | 通常为-128至127或0至255,与体系结构相关 | %c | 字节(Byte) | 大多数情况下即signed char; 在极少数1byte != 8bit或不使用ASCII字符集的机器类型上范围可能会更大或更小。其它类型同理。 |
unsigned char | 1bytes | 通常为0至255 | %c、%hhu | 字节 | |
signed char | 1bytes | 通常为-128至127 | %c、%hhd、%hhi | 字节 | |
int | 2bytes(16位系统) 或 4bytes | -32768至32767或 -2147483648至2147483647 | %i、%d | 字(Word)或双字(Double Word) | 即signed int (但用于bit-field时,int可能被视为signed int,也可能被视为unsigned int) |
unsigned int | 2bytes 或 4bytes | 0至65535 或 0至4294967295 | %u | 字或双字 | |
signed int | 2bytes 或 4bytes | -32768至32767 或 -2147483648至2147483647 | %i、%d | 字或双字 | |
short int | 2bytes | -32768至32767 | %hi、%hd | 字 | 即signed short |
unsigned short | 2bytes | 0至65535 | %hu | 字 | |
signed short | 2bytes | -32768至32767 | %hi、%hd | 字 | |
long int | 4bytes 或 8bytes | -2147483648至2147483647 或 -9223372036854775808至9223372036854775807 | %li、%ld | 长整数(Long Integer) | 即signed long |
unsigned long | 4bytes 或 8bytes | 0至4294967295 或 0至18446744073709551615 | %lu | 整数(Unsigned Integer)或长整数(Unsigned Long Integer) | 依赖于实现 |
signed long | 4bytes或 8bytes | -2147483648至2147483647 或 -9223372036854775808至9223372036854775807 | %li、%ld | 整数(Signed Integer)或长整数(Signed Long Integer) | 依赖于实现 |
long long | 8bytes | -9223372036854775808至9223372036854775807 | %lli、%lld | 长整数(Long Integer) | |
unsigned long long | 8bytes | 0至18446744073709551615 | %llu | 长整数(Unsigned Long Integer) | |
float | 4bytes | 2.939x10−38至3.403x10+38 (7 sf) | %f、%e、%g | 浮点数(Float) | |
double | 8bytes | 5.563x10−309至1.798x10+308 (15 sf) | %lf、%e、%g | 双精度浮点型(Double Float) | |
long double | 10bytes或 16bytes | 7.065x10-9865至1.415x109864 (18 sf或33 sf) | %lf、%le、%lg | 双精度浮点型(Double Float) | 在大多数平台上的实现与double 相同,实现由编译器定义。 |
_Bool | 1byte | 0或1 | %i、%d | 布尔型(Boolean) |
注:粗体为C99所新增的类型。
C99增加了一个布尔型(真/假)类型_Bool。此外,
unsigned char b = 256;
if (b) {
/* do something */
}
如果unsigned char的大小为8位,则变量b评估为假。这是因为数值256不适合数据类型,这导致它的低8位被使用,结果是一个零值。然而,改变类型会使以前的代码表现正常。
_Bool b = 256;
if (b) {
/* do something */
}
类型_Bool也确保真值总是相互比较相等。
_Bool a = 1, b = 2;
if (a == b) {
/* this code will run */
}