在C/C++中,整型的長度跟編譯器相關,編譯器的實現取決於CPU。 比如TC++是DOS16下的應用程序,DOS16是16位的操作系統,所以TC++中sizeof(int)==16;同理win32中sizeof(int)==32。
C99標准定義一個叫著<stdint.h>的頭文件,該頭文件定義了一系列各種類別的整數類型typedef名字。盡管速多C++工具支持該頭文件已經有一段時間了,但它尚未正式收錄於C++標准,因此,在使用該頭文件之前,你應該先閱讀你的編譯器文檔,看看它是否支持該文件。在某些C++ 的編譯器中,如GNC,為了能使用C99標准的這些新特性,就在<inttypes.h>頭文件中引入了這個文件< stdint.h>.
字長固定的整型類型
C99標准在<stdint.h>這個頭文件的類型定義中,有一套是字長固定的整型類型:
int8_t int16_t int32_t int64_t
與其對應的字長固定的無符號型整型類型有:
uint8_t uint16_t uint32_t uint64_t
它們的名字非常直觀。例如,int8_t是長度固定為8比特的有符號整型類型,而uint8_t則是字長固定為8比特的無符號型整型類型。當你需要確保在不同的平台上,整型數據的字長固定不變,那麼你就可以使用這些typedef名字。允許對期望的性質進行更為詳細的描述。例如,有的類型的名字是 int_least8_t,它至少有 8 位,還有 int32_t,它恰好是 32 位。
C99標准標准保證至少可以訪問 8 位、16 位、32 位和 64 位類型。沒有保證會提供精確寬度類型。不要使用這種類型,除非您肯定是實在不能接受更大的類型。另一個可選的類型是新的 intptr_t 類型,它是一個足夠大的可以容納一個指針的整數。並不是所有的系統都提供這樣一種類型(盡管當前所有的 Linux 和 BSD 實現都提供)。
字長最小的快速整型類型
該頭文件還定義了另外一套typedef名字,即“最小指定長度的快速整數類型”。這套typedef名字中的每一種都表示一種整數類型,它滿足在長度不小於某個指定長度的前提下,擁有最快的處理速度。這些整數類型的名字為int_fastX_t(有符號)或者uint_fastX_t(無符號),其中“X”表示最小指定長度。例如,int_fast32_t指得是字長至少為32比特的快速有符號整型類型。最小字長快速整型類型有:
int_fast8_t int_fast16_t int_fast32_t int_fast64_t
對應的無符號整型類型有:
uint_fast8_t uint_fast16_t uint_fast32_t uint_fast64_t
什麼情況下使用這些typedef名字?
假設你需要一個字長不少於16比特的循環計數器,那麼你會希望該計數器的類型總是當前計算機CPU最佳操作的整型類型,而int_fast16_t可以保證任何平台上的編譯器總是選擇字長不少於16比特的最快整型類型。
#include <inttypes.h>
for (int_fast16_t n=0; n<30000; ++n)
{
//.. do something
}
===================================================================
關於整型參數移植
假如你需要確定容量的整型,那麼你應該使用stdint.h或者inttypes.h中定義的類型.
這些頭文件中定義了以下的整數類型:
int8_t;
uint8_t;
int16_t;
uint16_t;
int32_t;
uint32_t;
int64_t;
uint64_t;
int_least8_t;
uint_least8_t;
int_least16_t;
uint_least16_t;
int_least32_t;
uint_least32_t;
int_least64_t;
uint_least64_t;
int_fast8_t;
uint_fast8_t;
int_fast16_t;
uint_fast16_t;
int_fast32_t;
uint_fast32_t;
int_fast64_t;
uint_fast64_t;
intptr_t;
uintptr_t;
intmax_t;
uintmax_t;
如果是boost庫的用戶則比較幸運,因為在boost庫中,<cstdint.hpp>這個頭文件封裝了C99標准<stdint.h>中的整數類型.