C 语言非常适合于编写系统程序,它的基本数据类型,如 int,其取值范围并不是固定的,而是与计算机硬件的体系结构、操作系统以及编译器等相关的。这样,让我们编写一个 C 语言程序来探查一下吧,下面就是 sizeof.c:
#include <stdio.h> #include <float.h> #define PR(x) printf("%11s: %2lu bytes/n", #x, (unsigned long)sizeof(x)) int main(void) { PR(size_t); PR(void *); PR(char); PR(short); PR(int); PR(long); PR(long long); PR(float); PR(double); PR(long double); printf("/n---- DIG -------EPSILON -----------MIN -----------MAX/n"); printf(" FLT %3d %-14E %-14E %-14E/n", FLT_DIG, FLT_EPSILON, FLT_MIN, FLT_MAX); printf(" DBL %3d %-14E %-14E %-14E/n", DBL_DIG, DBL_EPSILON, DBL_MIN, DBL_MAX); printf("LDBL %3d %-14LE %-14LE %-14LE/n", LDBL_DIG, LDBL_EPSILON, LDBL_MIN, LDBL_MAX); printf("---- --- -------------- -------------- --------------/n"); return 0; }
这个程序在 ideone.com 中的运行结果如下所示:
size_t: 4 bytes void *: 4 bytes char: 1 bytes short: 2 bytes int: 4 bytes long: 4 bytes long long: 8 bytes float: 4 bytes double: 8 bytes long double: 12 bytes ---- DIG -------EPSILON -----------MIN -----------MAX FLT 6 1.192093E-07 1.175494E-38 3.402823E+38 DBL 15 2.220446E-16 2.225074E-308 1.797693E+308 LDBL 18 1.084202E-19 3.362103E-4932 1.189731E+4932 ---- --- -------------- -------------- --------------
在我的 Lenovo PC 机的 Arch Linux 64 bit 操作系统环境下,使用 gcc 编译器和 clang 编译器,其运行结果如下所示:
$ sizeof size_t: 8 bytes void *: 8 bytes char: 1 bytes short: 2 bytes int: 4 bytes long: 8 bytes long long: 8 bytes float: 4 bytes double: 8 bytes long double: 16 bytes ---- DIG -------EPSILON -----------MIN -----------MAX FLT 6 1.192093E-07 1.175494E-38 3.402823E+38 DBL 15 2.220446E-16 2.225074E-308 1.797693E+308 LDBL 18 1.084202E-19 3.362103E-4932 1.189731E+4932 ---- --- -------------- -------------- --------------
上述结果中,long double 是 16 bytes 的,但是实际上其范围和精度是和 12 bytes 的是一样的,可能是在 64-bit 操作系统中为了对齐字节边界的考虑吧。