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' 。
宣告字元型態的變數可用 signed 或 unsigned 修飾詞修飾,可將該字元型態變數的值限制成帶有正負號,或無正負號,不過使用上視機器需要而定。
有些不可見字元及單引號本身可用跳脫序列 (escape sequence) 來表示,以下為跳脫序列的完整列表
跳脫序列的字元 | 功能 |
---|---|
\a | 響鈴 |
\b | 倒退鍵 |
\f | 跳頁 |
\n | 印出新列 |
\r | 歸位符號 |
\t | tab 鍵 |
\v | 垂直定位符號 |
\\ | 印出反斜線 |
\? | 印出問號 |
\' | 印出單引號 |
\" | 印出雙引號 |
整數類
C 語言的整數型態可概略分成 short 、 int 、 long 、 long long 幾類,其中 short 、 int 、 long 等都為關鍵字。
short 被稱為短整數,佔用 2 個 byte 的記憶體空間,也就是 16 位元,可儲存 -32768 到 32767 之間的整數值。 long 被稱為長整數,則至少佔有 4 個 byte 的記憶體空間,也就是 32 位元,可儲存 -2147483648 到2147483647 之間的整數。
int 通常就稱為整數,而且所表示的範圍大小就跟機器硬體的整數大小相同,同時規定 short 的範圍不可大於 int ,也不可大於 long ,所以若是 32 位元的機器, int 與 long 的範圍大小會相同。 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;
若是宣告整數變數後沒有給予初值,有可能該變數會保留記憶中空間原先的殘值,或是編譯器會自動歸零,或發生編譯時的錯誤,視所用編譯器而定。
宣告整數型態的變數可用 signed 或 unsigned 修飾詞修飾,可將該整數型態變數強制限定帶有正負號,或無正負號,使用上視需要而定。
浮點數類
C 語言的浮點數型態可概略分成 float 、 double 、 long double 幾類,其中 float 、 double 、 long 等都為關鍵字。
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;
若是宣告整數變數後沒有給予初值,有可能該變數會保留記憶中空間原先的殘值,或是編譯器會自動歸零,或發生編譯時的錯誤,視所用編譯器而定。