c語言的基本資料型別

黃志斌發表於2016-06-23

C 語言非常適合於編寫系統程式,它的基本資料型別,如 int,其取值範圍並不是固定的,而是與計算機硬體的體系結構、作業系統以及編譯器等相關的。這樣,讓我們編寫一個 C 語言程式來探查一下吧,下面就是 sizeof.c:

#include <stdio.h>
#include <float.h>
#include <stdlib.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");
  printf("RAND_MAX: %d\n", RAND_MAX);
  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
---- --- -------------- -------------- --------------
RAND_MAX: 2147483647

在我的 Lenovo PC 機的 Arch Linux 64 bit 作業系統環境下,使用 tcc、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
---- --- -------------- -------------- --------------
RAND_MAX: 2147483647

上述結果中,long double 是 16 bytes 的,但是實際上其範圍和精度是和 12 bytes 的是一樣的,可能是在 64-bit 作業系統中為了對齊位元組邊界的考慮吧。

參考資料

  1. Wikipedia: C datatypes
  2. TCC: Tiny C Compiler
  3. GCC, the GNU Compiler Collection
  4. clang: a C language family frontend for LLVM

相關文章