資料表示法:位元、位元組與數值

整數寬度與定寬型別

程式裡的每個整數都住在一個固定位元數的盒子裡,而那個盒子的大小——它的寬度——決定它能保存多大的值。較寬的盒子搆得更高;較窄的盒子省空間但更快溢位。選擇寬度是系統程式設計的日常決定之一,選錯則是只在某些機器上或某些輸入下才現形的經典錯誤來源。

純 C 的麻煩在於基本型別對大小刻意含糊。標準只保證下限和一個順序:char 至少 8 位元,short 至少 16,int 至少 16(今日常為 32),long 至少 32,long long 至少 64。實際大小是實作定義的,所以同一個 int 在某平台可能是 32 位元,在另一平台可能是別的。為了擺脫這份不確定,C99 加入了標頭檔 stdint.h,內含說一不二的定寬型別:int8_t、uint8_t、int16_t、uint16_t、int32_t、uint32_t、int64_t、uint64_t——在每個合規平台上都是精確的寬度、有號或無號。

凡是大小要緊之處就用定寬型別:解析具有定義佈局的檔案或網路封包、打包位元,或防範溢位。用 size_t 表示大小和陣列索引(它是寬到足以涵蓋任何物件的無號型別),用 intptr_t / uintptr_t 表示必須容納指標的整數。誠實的提醒:sizeof 在「編譯期」告訴你某型別在你所編譯的機器上的寬度(以位元組計),所以絕不要把「int 是 4 個位元組」這類假設硬寫進檔案格式或通訊協定——用定寬型別把寬度明確寫下來。

uint32_t 在每個平台上永遠保存 32 個無號位元(0 到 4294967295),而純 int 視機器可能是 16、32 或 64 位元。對網路標頭,要寫 uint32_t,絕不寫 int。

stdint.h 的定寬型別釘死大小;基本型別則不會。

sizeof 是個產生 size_t 的編譯期運算子,不是執行期函式;而 sizeof(int) 會因平台而異——依賴某個特定值是不可攜的,這正是定寬型別存在的原因。

又稱
bit widthint8_t / uint32_tstdint types定寬整數