C語言中文網 目錄
首頁 > 編程筆記 > C語言筆記 閱讀:8,968

C語言整數類型(含取值范圍和長度)

C語言支持 5 種帶符號的整數類型。其中大多數整數類型具有多個同義詞,見表1。

表1:帶符號的標準整數類型
類型 同義詞
signed char  
int signed, signed int
short short int, signed short, signed short int
long long int, signed long, signed long int
long long (C99) long long int, signed long long,signed long long int

對于表1列出來的 5 種帶符號整數類型,它們每個都有對應的無符號類型。與帶符號類型相比,對應的無符號類型內存大小相同,對齊方式(alignment)也相同。換句話說,如果編譯器將 signed int 對象對齊到偶數地址上,則 unsigned int 對象也對齊到偶數地址。表2列出了無符號類型。

表2:無符號的標準整數類型
類型 同義詞
_Bool bool(在 stdbool.h 頭文件中定義)
unsigned char  
unsigned int unsigned
unsigned short unsigned short int
unsigned long unsigned long int
unsigned long long unsigned long long int

C99 引入了無符號整數類型 _Bool 用來表示布爾值。布爾值真(true)被定義為 1,假(false)被定義為成 0。如果程序中包含 stdbool.h 頭文件,也可以使用標識符 bool、true 以及 false,這是 C++ 程序員相當熟悉的三個關鍵字。宏 bool 是 _Bool 類型的同義字,但 true 和 false 是符號常量,它們的值分別為 1 和 0。

char 類型也是一個標準的整數類型。但是,僅有一個單詞的類型名稱 char,既可以是 signed char 的同義詞,又可以是 unsigned char 的同義詞,這由編譯器決定。因為這是由所采用的實現版本自行選擇的,所以嚴格地說,char、signed char和unsigned char 是三種不同的數據類型。

如果程序會用到的 char 值包括小于 0 或大于 127 的情況,則應該使用 signed char 或者 unsigned char,而不是 char。

可以對字符變量做算術操作。由程序自身決定是否將 char 變量的值解釋為字符碼或其他東西。例如,下面的小程序將屬于 char 類型的 ch 變量,既看成一個整數又看成一個字符,不過是在不同時刻:
char ch= 'A';                  // 數據類型為char的變量
printf("The character %c has the character code %d.\n", ch, ch);
for ( ; ch <= 'Z' ; ++ch )
    printf("%2c", ch);
在 printf() 語句中,ch 先被視為一個字符以獲得顯示,然后被視為該字符的整數編碼。同樣,for 循環在執行 ++ch 的時候將 ch 視為整數,在執行 printf() 的時候,將 ch 視為字符。在使用 7 位 ASCII 碼或者擴展 ASCII 碼的系統中,上述程序代碼將輸出以下內容:

The character A has the character code 65.
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z

各種類型的長度和取值范圍

char 類型的值占用一個字節(換句話說,sizeof(char)總是等于1),并且 1 個字節至少是 8 位長。基本字符集中的每個字符都可以作為一個正整數值以 char 對象表示。

對于其他標準類型,C語言只定義了其最小的存儲空間:
  • short 類型至少占用 2 個字節;
  • long 類型至少占用 4 個字節;
  • 而 long long 類型至少占用 8 個字節。

此外,雖然整數類型實際所占用的空間可能大于它們的最小空間,但是不同類型的空間大小一定遵循以下次序:

sizeof(short) ≤ sizeof(int) ≤ sizeof(long) ≤ sizeof(long long)

int 類型是最適應計算機系統架構的整數類型,它具有和 CPU 寄存器相對應的空間大小和位格式。

表3列出了標準整數類型的存儲空間大小和值范圍。

表3:標準整數類型常見存儲空間大小和取值范圍
類型 存儲空間大小 最小值 最大值
char (與 signed char 或 unsigned char 相同)  
unsigned char 1個字節 0 255
signed char 1個字節 -128 127
int 2個或4個字節 -32 768 或 -2 147 483 648 32767 或 2 147 483 647
unsigned int 2個或4個字節 0 65 535 或 4 294 967 295
short 2個字節 -32 768 32 767
unsigned short 2個字節 0 65 535
long 4個字節 -2 147 483 648 2 147 483 647
unsigned long 4個字節 0 4 294 967 295
long long (C99) 8個字節 -9 223 372 036 854 775 808 9 223 372 036 854 775 807
Unsigned long long (C99) 8個字節 0 18 446 744 073 709 551 615

在下面的示例中,如果系統運行平臺是32位,則int類型的iIndex和iLimit變量分別占用4個字節:
int iIndex,         // 定義兩個int變量
    iLimit= 1000;        // 初始化第二個
利用 sizeof 運算符,可以獲取一個數據類型或變量的空間大小。表達式 sizeof(type)輸出指定類型的大小;sizeof expression 輸出指定表達式類型的大小。輸出結果是類型為 size_t 的一組字節。如果操作數是一個表達式,則輸出結果是該表達式的類型。
size_t 類型作為一個無符號整數類型(如 unsigned long)定義在頭文件 stddef.h、stdio.h,以及其他頭文件中。
在上述示例中,sizeof(int) 的值會和 sizeof(iIndex)一樣(都是4)。sizeof(iIndex) 的圓括號可以去掉,因為 iIndex 是一個表達式,不是一個類型。

可以在頭文件 limits.h 中找到所采用編譯器中整數類型的取值范圍,它們定義為宏,例如宏 INT_MIN、INT_MAX 和 UINT_MAX 等。下面的程序使用這些宏來顯示 char 和 int 類型的最小值和最大值。

例1:char和int類型的取值范圍
#include <rstdio.h>
#include <limits.h>  // 該文件包含了CHAR_MIN、INT_MIN等宏
int main()
{
    printf("Storage sizes and value ranges of the types char and int\n\n");
    printf("The type char is %s.\n\n", CHAR_MIN<0? "signed":"unsigned");

    printf(" Type Size (in bytes)   Minimum             Maximum\n"
        "--------------------------------------------------\n");
    printf("char %8zu %20d %15d\n", sizeof(char), CHAR_MIN, CHAR_MAX );
    printf("int %8zu %20d %15d\n",  sizeof(int), INT_MIN, INT_MAX );
    return 0;
}

在標準頭文件中定義的整數類型

標準庫的頭文件針對特定用途定義了很多整數類型,例如用來顯示寬字符的 wchar_t 類型。這些類型是 typedef 名稱,它們是標準整數類型的同義詞。

類型 ptrdiff_t、size_t 和 wchar_t 定義在頭文件 stddef.h 中(以及其他頭文件中);類型 char16_t 和 char32_t 定義在頭文件 uchar.h 中。為了特殊需要,指定位長度的整數類型(帶符號和無符號變量)定義在頭文件 stdint.h 中。

此外,頭文件 stdint.h 也為標準庫中的所有整數類型可顯示的最大值與最小值定義了宏。例如,SIZE_MAX 等于可以在 size_t 類型變量中存儲的最大值。

精美而實用的網站,提供C語言C++STLLinuxShellJavaGo語言等教程,以及socketGCCviSwing設計模式JSP等專題。

Copyright ?2011-2018 biancheng.net, 陜ICP備15000209號

底部Logo