2013-11-04 68 views
14

我在stdint.h中看到了一個整數的不同類型的定義。以無符號32位整數爲例。uint32_t vs uint_fast32_t vs uint_least32_t

  1. uint32_t顯然意味着32個比特的無符號整數。這是我一直使用的那個。

  2. uint_fast32_tuint_least32_t:什麼是與uint32_t的差異,當我要使用它們,而不是uint32_t

而現在,我看到uintX_t,其中X爲24,40,48和56這發生在我的代碼,我有48和56位整數的工作。舉個例子,我想uint24_t是定義爲這樣的事情:

struct uint24_t { unsigned int the_integer : 24; }; 

我說得對不對?並且,你會建議我使用uint48_t作爲我的48位無符號整數,還是應該使用正常的uint64_t

感謝您的解釋。

+1

'uint_fast32_t和uint_least32_t也意味着32位的無符號整數'錯誤 –

+0

部分重複的http://stackoverflow.com/questions/5254051/the-difference-of-int8-t-int-least8-t-and -int-fast8-t/5254321 – dan04

回答

19

什麼與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位整數類型的平臺已經非常奇怪,大多數人不關心他們的代碼是否在其上運行。

+0

「'uint32_t'是至少32位的最小類型」,你的意思是'uint32_least_t'? –

+0

@Bryan:我這樣做,謝謝 –

+0

我以前不敢用這些類型,但有了這個詳細的答案,我得到了我需要的所有解釋。謝謝 ! –

13

uint32_t僅當平臺支持寬度恰好爲32位且沒有填充的無符號整型時才存在。

uint32_least_t總是存在,並且是一個至少有32位的無符號整數類型,它是最小的這種類型。

uint32_fast_t也總是存在並且是至少32位的整數類型,並且它是平臺的「最自然的」類型,即操作產生最有效代碼的類型。

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

相關問題