首頁  >  文章  >  後端開發  >  在 C 和 C 中選擇適當的整數類型

在 C 和 C 中選擇適當的整數類型

DDD
DDD原創
2024-09-13 10:15:06287瀏覽

Choosing an Appropriate Integer Type in C and C

介紹

當 Dennis Ritchie 創建 C 時,他將 int (有符號整數類型)作為預設類型。 int 的大小(位數)是故意指定的。 即使 C 被標準化,所保證的也只是最小大小。 基本原理是 int 的大小應該是給定 CPU 上整數的「自然」字大小。

如果您只需要較小的有符號整數並且想節省一點空間,Ritchie 給了我們short;或者,如果您需要更大的整數,他給了我們 long。 (C99 為我們提供了更大的 long long 整數。)如果您只需要無符號整數,則可以在聲明中包含 unsigned。 C99 也為我們提供了特定大小的有符號整數類型別名(例如 int32_t)和無符號類型別名(例如 uint32_t)。

但是,在程式設計中,大多數時候不需要負整數(因此需要有符號整數型別)。 字串的長度、物件的數量、物件的大小、檔案的大小等都是無符號整數。 需要特定大小的型別別名,甚至少於有符號整數。

然而,我已經看到很多程式碼不恰當地使用了整數類型。 此類代碼可能會向讀者(包括幾個月後的您自己)傳達不明確或誤導性的信息。 最好為正確的目的選擇正確的整數類型。

指南

以下是我選擇整數類型的指南:

  • 表示記憶體中位元組數時,使用 size_t 標準型別別名。

這是 C 和 C 標準函式庫都使用的型別,例如 memcpy()、strlen()、std::string::size() 等,因此有許多先例。

  • 當表示磁碟上檔案的大小或位置時,請使用off_t POSIX類型別名。

如果您正在處理非常大文件,在某些平台上,您可能需要使用 -D_FILE_OFFSET_BITS=64 進行編譯以獲得 64 位元版本的 off_t。

  • 當表示記憶體中物件的數量時,也使用 size_t。

這也是 C 和 C 標準函式庫使用的型別,例如 fread() 和 fwrite()。

  • 只有當您需要表示包含在特定位數內的值或您需要符合特定API 時,請使用符號類型的int8_t、int16_t、int32_t 或int64_t 類型別名之一;或無符號類型的uint8_t 、uint16_t、uint32_t 或uint64_t 類型別名之一。

通常需要固定大小的整數的唯一時間是當您「外部化」一個值時,例如,將其寫入磁碟或透過套接字發送它。

當您實際上不需要特定位數時使用固定大小的整數會向讀者傳達錯誤的訊息。

此外:

  • 當表示必須精確指標大小的整數值時,請使用標準 intptr_t 或 uintptr_t 類型別名。

  • 只有當您需要負值時,才使用short、int、long或long long之一,首選int,除非您需要更小或更大的值。

最後:

  • 否則,請使用 unsigned short、unsigned、unsigned long 或 unsigned long long 之一,除非您需要更小或更大的值,否則首選 unsigned。

也就是說,除非您正在處理上面列出的情況之一,否則預設使用無符號類型。

結論

選擇正確的整數類型可以向讀者傳達正確的訊息,並且可以消除運行時檢查。

結語

最初,直到 C99,int 都是隱式類型,也就是說,如果你根本沒有指定任何類型,它就會被理解為 int。 例如:

power( x, n )  /* x and n are int; returns int */
{
    int p;
    for ( p = 1; n > 0; --n )
        p *= x;
    return p;
}

定義一個具有 int 參數並傳回 int 的函數,但聲明中未使用 int。

函數原型從 C 向後移植到 C89,但原始的「K&R 風格」函數定義仍然被允許一直到 C23。 ANSI C 委員會是一群保守派。

更奇怪的是,C99 之前的版本也允許 int 隱含在聲明中,例如:

i;      // int i
*p;     // int *p
*a[4];  // int *a[4]
*f();   // int *f()

幸運的是,這樣的聲明早已是非法的。

以上是在 C 和 C 中選擇適當的整數類型的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn