簡體   English   中英

uint32_t vs uint_fast32_t vs uint_least32_t

[英]uint32_t vs uint_fast32_t vs uint_least32_t

我在stdint.h看到了不同類型的整數定義。 我將以無符號32位整數為例。

  1. uint32_t顯然是一個32位的無符號整數。 這就是我經常使用的那個。

  2. uint_fast32_tuint_least32_t :與uint32_t的區別是什么?我何時應該使用它們而不是uint32_t

現在,我看到了uintX_t ,其中X是uintX_t和56.在我的代碼中,我必須使用48和56位整數。 舉個例子,我想uint24_t的定義是這樣的:

struct uint24_t { unsigned int the_integer : 24; };

我對嗎 ? 並且,你建議我使用uint48_t作為我的48位無符號整數,還是應該使用普通的uint64_t

謝謝你的解釋。

與uint32_t的區別是什么

uint_fast32_t是至少32位的無符號類型,(以某種通用方式)是最快的類型。 “快速”意味着給定一個選擇,實現者可能會選擇體系結構具有算術,加載和存儲指令的大小。 它不是任何特定基准的贏家。

uint_least32_t是至少32位的最小無符號類型。

uint32_t是一個正好32位的類型,沒有填充,如果存在任何這種類型。

我對嗎?

不。如果uint24_t存在,則它是整數類型,而不是struct 如果在此實現中沒有24位的無符號整數類型,則它不存在。

由於unsigned long必須至少為32位,因此uint24_t可能成為別名的唯一標准類型是charunsigned charunsigned shortunsigned int 或者,它可以是擴展類型(即,由實現提供的整數類型,不是標准中任何定義的整數類型)。

你會建議我使用uint48_t作為我的48位無符號整數嗎?

如果它存在並且是您想要的大小,那么您也可以使用它。 但是,它不會存在於很多實現中,因此它僅適用於非可移植代碼。 如果您必須處理精確的48位整數是特定於平台的原因,那就沒問題。

確切的16,32和64位類型在技術上也是可選的,但如果實現具有合適的整數類型,則它們必須存在。 “合適”不僅意味着存在精確的N位無符號類型而沒有填充位,而且相應的帶符號類型沒有填充位並使用2的補碼表示。 在實踐中,這是如此接近於任何地方,你通過使用它們中的任何一個來限制可移植性。 為了獲得最大的可移植性,您應該使用uint_least32_tuint_fast32_t而不是uint32_t 哪一個取決於您是否更關心速度或尺寸。 根據我的經驗,很少有人會煩惱,因為沒有32位整數類型的平台已經非常奇怪,以至於大多數人並不關心他們的代碼是否在其上運行。

uint32_t僅在平台支持無符號整數類型時才存在,該類型正好是32位寬且沒有填充。

uint32_least_t始終存在,並且是一個至少為32位的無符號整數類型,它是最小的類型。

uint32_fast_t也總是存在,並且是一個至少32位的整數類型,它是平台的“最自然”類型,即操作生成最有效代碼的類型。

注意:簽名版本int32_t也需要2的補碼表示。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM