C語言有5種基本的數據類型,分別為 字符型、整型、單精度浮點型、雙精度浮點型、空類型。
在不同的操作系統或硬件平台中,這些數據類型的值域范圍和所占用的內存是有差異的。這種差異影響了C語言的可移植性能,但如果能深入理解數據類型的構成,則可以最大程度避免該問題。
2.1.1 基本數據類型的字長與范圍
字長是指數據所占用內存的數量,字長決定了數據類型的值域,即范圍。以字符型為例,ANSI C標准中的字符型的長度是 1 字節(8位二進制編碼),可計算其值域為 -2的7次方 - +2的7次方,取值范圍為 -128~127。
計算機所使用的ASCII字符編碼共有 128 個元素,所以用字符型可將全部元素表示出來。依次類推,ANSI C 標准中其他基本類型的字長與范圍如下表所示:
ANSI C標准基本類型的字長與范圍 | ||
---|---|---|
基本類型 | 字長 | 范圍 |
char(字符型) | 1字節 | -128~127 |
int(整型) | 2字節 | -32768~32767 |
float(單精度浮點型) | 4字節 | 約精確到6位數 |
double(雙精度浮點型) | 8字節 | 約精確到12位數 |
void(空值型) | 0字節 | 無值 |
由於硬件平台和操作系統的不同,數據類型的字長可能與上表不同。例如,運行在AMD64架構的Linux系統中,整型的長度為 4 字節。要獲得當前系統環境中數據類型的字長,可運行下列程序。
#include <stdio.h> int main() { printf("字符型字長為%d\n", sizeof(char)); printf("整型字長為%d\n", sizeof(int)); printf("長整型字長為%d\n", sizeof(long)); printf("單精度浮點型字長為%d\n", sizeof(float)); printf("雙精度浮點型字長為%d\n", sizeof(double)); return 0; }
輸出:
字符型字長為 1
整型字長為 4
長整型字長為 8
單精度浮點型字長為 4
雙精度浮點型字長為 8
該程序使用 sizeof() 函數返回數據類型的字長,sizeof()函數的返回值為整型數據 ,返回的結果由printf()函數輸出到終端中。
2.1.2 聚合類型與修飾符
C語言支持聚合類型,包括數組、指針、結構體、公用體(聯合)、位域和枚舉。聚合類型構成了復雜的數據結構,用以描述事物的各種屬性。除 void類型 外,基本類型的前面可以有各種修飾符。修飾符用來改變
基本類型的意義,以便更准確地適應各種情況的需求。修飾符如下:
- signed(有符號);
- unsigned(無符號);
- short(短型);
- long(長型);
signed、unsigned、short、long 修飾符適用於 字符 和 整數 兩種基本類型,而 long 還可以用於 double 。unsigned 和 signed 修飾符分別表示 無正負值符號 和 有正負值符號 的數據類型中,
計算機中原始數據類型使用的是二進制數,如果要表示正負值符號則需要用1位存儲空間。以字符型為例,無符號字符型取值值域為 2的8次方,那么范圍為 0~255,有符號字符型將1位用於存儲符號,取值值域為 2的7次方,那么范圍為 -128~127。下表給出所有根據 ANSI C 標准而組合的類型、字長和范圍。
ANSI C標准組合的類型、字長和范圍 | ||
---|---|---|
類型 | 字長 | 范圍 |
char(字符型) | 1字節 | -128~127 |
unsigned char(無符號字符型) | 1字節 | 0~255 |
signed char(有符號字符型) | 1字節 | -128~127 |
int(整型) | 2字節 | -32 768~32 767 |
unsigned int(無符號整型) | 2字節 | 0~65 535 |
signed int(有符號整型) | 2字節 | -32 768~32 767 |
short int(短整型) | 1字節 | -128~127 |
unsigned short int(無符短整型) | 1字節 | 0~255 |
signed short int(有符號短整型) | 1字節 | -128~127 |
long int(長整型) | 4字節 | -2 147 483 648~2 147 483 647 |
unsigned long int(無符號長整型) | 4字節 | 0~4 294 967 296 |
signed long int(有符號長整型) | 4字節 | -2 147 483 648~2 147 483 647 |
float(單精度浮點型) | 4字節 | 約精確到 6 位數 |
double(雙精度浮點型) | 8字節 | 約精確到 12 位數 |
void(空值型) | 0字節 | 無值 |
因為數據類型的默認定義是有符號數,所以 signed修飾符通常可省略。某些編譯器允許將unsigned用於浮點型,如 unsigned double。但這一用法降低了程序的可移植性,故建議一般不要采用。為了使用方便,GCC編譯程序允許使用整型的簡寫形式:short int 表示 short,即 int 可省略。
注意:表示正數時,最大能表示的值總是比值域少 1,這是因為將 0 作為正數看待,0占用了一個取值空間。