C 速查手冊

單元 2 - 基本資料型態

在 C 語言中定義變數 (variable) 前,需要先經過宣告為某種資料型態 (data type) ,好讓編譯器 (compiler) 分配記憶體空間出來, C 語言的基本資料型態可以分成三大類

字元

C 語言的字元型態 (character) 佔用 1 個 byte ,也就是 8 個位元,以下程式 (program) 會計算出字元型態所佔的位元組數

#include <stdio.h>

int main(void)
{
    printf("%s%4d\n", "char", sizeof(char));
    return 0;
}

/* 《程式語言教學誌》的範例程式
    http://kaiching.org/
    檔名:sizeofchar.c
    功能:列印出字元型態所佔的記憶體空間
    作者:張凱慶 */

編譯執行結果如下

$ gcc sizeofchar.c
$ a.out
char   1
$

宣告字元型態的變數使用關鍵字 char ,如

char a;

可以稍後利用指派給初值,凡是用單引號圍起來的單一字元都屬於字元型態的常數 (constant) ,因此

a = 'd';

這樣就把字元 'd' 指派到變數 a 裡了,也可以宣告同時給予初值

char a = 'd';

宣告變數的目的是先保留符合型態大小的記憶體空間,指派數值給該變數後,會將該數值的位元編碼形式儲存到所保留的記憶體空間之中。若是宣告變數後沒有給予初值,有可能該變數會保留記憶中空間原先的殘值,或是編譯器會自動歸零,視所用編譯器而定。

由於 C 語言直接支援 ASCII 編碼,因此凡是 ASCII 編碼的符號皆可以直接用字元型態來處理,同時,字元型態也可以用整數來表示,就是說字元型態的變數可以對應到 ASCII 編碼所表示的十進位數字,例如

char a = 100;

這樣變數 a 的值會等於 ASCII 編碼中編為十進位 100 的值,也就是字元 'd'

宣告字元型態的變數可用 signedunsigned 修飾詞修飾,可將該字元型態變數的值限制成帶有正負號,或無正負號,不過使用上視機器需要而定。

有些不可見字元及單引號本身可用跳脫序列 (escape sequence) 來表示,以下為跳脫序列的完整列表

跳脫序列的字元功能
\a響鈴
\b倒退鍵
\f跳頁
\n印出新列
\r歸位符號
\ttab 鍵
\v垂直定位符號
\\印出反斜線
\?印出問號
\'印出單引號
\"印出雙引號

整數類

C 語言的整數型態可概略分成 shortintlonglong long 幾類,其中 shortintlong 等都為關鍵字。

short 被稱為短整數,佔用 2 個 byte 的記憶體空間,也就是 16 位元,可儲存 -32768 到 32767 之間的整數值。 long 被稱為長整數,則至少佔有 4 個 byte 的記憶體空間,也就是 32 位元,可儲存 -2147483648 到2147483647 之間的整數。

int 通常就稱為整數,而且所表示的範圍大小就跟機器硬體的整數大小相同,同時規定 short 的範圍不可大於 int ,也不可大於 long ,所以若是 32 位元的機器, intlong 的範圍大小會相同。 long long 是 C99 提出的標準,佔有 8 個 byte 的記憶體空間,也就是 64 位元,實際上運用視所用機器及編譯器可否支援。

以下程式會計算出四種整數型態所佔的位元組數

#include <stdio.h>

int main(void)
{
    printf("%9s%4d\n", "short", sizeof(short));
    printf("%9s%4d\n", "int", sizeof(int));
    printf("%9s%4d\n", "long", sizeof(long));
    printf("%s%4d\n", "long long", sizeof(long long));

    return 0;
}

/* 《程式語言教學誌》的範例程式
    http://kaiching.org/
    檔名:sizeofint.c
    功能:列印出整數型態所佔的記憶體空間
    作者:張凱慶 */

編譯執行結果如下

$ gcc sizeofchar.c
$ a.out
    short   2
      int   4
     long   8
long long   8
$

宣告使用整數型態的變數,以 int 為例

int a;

可以稍後利用指派給初值,也就是整數常數

a = 1;

這樣變數 a 具有整數 1 的值,也可以宣告同時給予初值

int a = 1;

若是宣告整數變數後沒有給予初值,有可能該變數會保留記憶中空間原先的殘值,或是編譯器會自動歸零,或發生編譯時的錯誤,視所用編譯器而定。

宣告整數型態的變數可用 signedunsigned 修飾詞修飾,可將該整數型態變數強制限定帶有正負號,或無正負號,使用上視需要而定。

浮點數類

C 語言的浮點數型態可概略分成 floatdoublelong double 幾類,其中 floatdoublelong 等都為關鍵字。

float 被稱為單精確度浮點實數,佔 4 個 byte 的記憶體空間, double 被稱為倍精確度浮點實數,佔 8 個 byte 的記憶體空間, long double 則被稱為延伸的倍精確度浮點實數,佔 16 個 byte 的記憶體空間。

由於浮點實數在電腦裡都是用模擬計算出逼近值,所以三種浮點數型態計算出的有效位數,佔用記憶體空間越多的有效位數會越長,一般來說, float 型態在小數點後六位就會出現誤差。

以下程式計算出三種浮點數型態所佔的位元組數

#include <stdio.h>

int main(void)
{
    printf("%11s%4d\n", "float", sizeof(float));
    printf("%11s%4d\n", "double", sizeof(double));
    printf("%s%4d\n", "long double", sizeof(long double));

    return 0;
}

/* 《程式語言教學誌》的範例程式
    http://kaiching.org/
    檔名:sizeoffloat.c
    功能:列印出浮點數型態所佔的記憶體空間
    作者:張凱慶 */

編譯執行結果如下

$ gcc sizeoffloat.c
$ a.out
      float   4
     double   8
long double  16
$

宣告使用浮點數型態的變數,以 double 為例

double a;

可以稍後利用指派給初值,也就是帶小數點的浮點數常數

a = 1.0;

這樣變數 a 具有浮點數 1.0 的值,也可以宣告同時給予初值

double a = 1.0;

若是宣告整數變數後沒有給予初值,有可能該變數會保留記憶中空間原先的殘值,或是編譯器會自動歸零,或發生編譯時的錯誤,視所用編譯器而定。

上一頁 1.6 運算子
回 C 速查手冊首頁
下一頁 單元 3 - 運算式
回 C 教材首頁
回程式語言教材首頁