C語言定義了如下的整數型別(unsigned類型沒列出):char short intlonglong long但C語言沒有規定了他們之間的關係為:sizeof(char) <= sizeof(short) <= sizeof(int) <= sizeof(long) <= sizeof(long long)現代UNIX系統不是32位就是64位(未來也許還有128位的),我總結的經驗值是:sizeof(char) == 1sizeof(short) == 2sizeof(int) == 4sizeof(long) == 4(32位)或8(64位)sizeof(long long) == 8在我用過的UNIX系統(GNU Linux、SUN Solaris、IBM AIX、HP-UX、MAC OSX)都是這樣,只要不是嵌入式開發,大部分都是上面的情況。當然,POSIX下面有更好的方法去定義一個固定長度的整型,在stdint.h裡面就有,大概可以分成這幾類:固定長度整型:int8_t / uint8_tint16_t / uint16_tint32_t / uint32_tint64_t / uint64_t類型中的數字就是該類型的位元,首碼u代表unsigned
規定了最小長度的整型:int_lease8_t / uint_least8_tint_lease16_t / uint_least16_tint_lease32_t / uint_least32_tint_lease64_t / uint_least64_tint_fast8_t / uint_fast8_tint_fast16_t / uint_fast16_tint_fast32_t / uint_fast32_tint_fast64_t / uint_fast32_tlease類整型保證 sizeof(int_lease[X]_t)*8 >= [X],其作用是,例如在一些硬體上可能硬體不支援直接儲存16位整型,只支援32位整型,如果用int16_t,就需要編譯器產生特殊的代碼去類比,這時候用lease類型可以減少不必要的代碼產生。fast類整型和lease類似,但它們是為了最佳化速度,一般來說,CPU處理和其字長(word)長度相同的整型會比較快(理論上),如果word是32位, 則int_fast8_t和int_fast16_t就定義為int_fast32_t。如果不考慮把程式移植到特殊的硬體上,lease和fast類整型一般不需要用到。
和指標長度相同的整型:intptr_t / uintptr_t喜歡把指標轉成int的人要注意了,如果希望寫出可移植的C代碼,一定不能有指標到int或int到指標的轉換,在32位還湊巧,在64位系統下就死翹翹了。上面兩個類型車長度保證和指標一樣,無論那個方向的轉換都很安全。(按照經驗值,用long也可以)
最大長度的整型:intmax_t / uintmax_t這兩個類型表示系統能處理的最大長度的整型,一般是64位,暫時還沒遇到過128位的系統。
unicode相互關聯類型:
wchar_t / wint_t
因為unicode標準有很多個版本,早期版本裡面的字元集用uint16_t就可以表示。後來隨著加入的字元數量越來越多,要用uint32_t才能表示。
wint_t則用來表示所有unicode字元和其擴充字元集的字元,具體可以看一下utf16的編碼方法。(我估計是這樣:某些系統的wchar_t裡面是utf16編碼,wint_t是utf32編碼)