uint32_t vs uint_fast32_t vs uint_least32_t

时间:2013-11-04 23:52:17

标签: c++ c++11 integer stdint

我在stdint.h中看到了不同类型的整数定义。我以无符号32位整数为例。

  1. uint32_t显然是32位的无符号整数。这是我一直使用的那个。

  2. uint_fast32_tuint_least32_tuint32_t的区别是什么?我应该何时使用它们代替uint32_t

  3. 现在,我看到uintX_t,其中X是24,40,48和56.在我的代码中,我必须使用48和56位整数。举个例子,我认为uint24_t定义如下:

    struct uint24_t { unsigned int the_integer : 24; };
    

    我是对的吗?并且,您是否建议我使用uint48_t作为我的48位无符号整数,还是应该使用正常的uint64_t

    感谢您的解释。

2 个答案:

答案 0 :(得分:21)

  

与uint32_t有什么区别

uint_fast32_t是至少32位的无符号类型,(以某种通用方式)是最快的类型。 “快速”意味着给定一个选择,实现者可能会选择体系结构具有算术,加载和存储指令的大小。它不是任何特定基准的赢家。

uint_least32_t是至少32位的最小无符号类型。

uint32_t是一种正好32位且没有填充的类型,如果存在任何这种类型的话。

  

我是对的吗?

没有。如果uint24_t存在,则它是整数类型,而不是struct。如果在此实现中没有无符号整数类型的24位,则它不存在。

由于unsigned long必须至少为32位,uint24_t可能成为别名的唯一标准类型是charunsigned char,{{ 1}}和unsigned short。或者,它可以是扩展类型(即,实现提供的整数类型,不是标准中任何已定义的整数类型)。

  

您是否建议我将uint48_t用于我的48位无符号整数?

如果它存在并且是您想要的大小,那么您也可以使用它。但是,它不会存在于很多实现中,因此它仅适用于非可移植代码。如果您必须处理精确的48位整数是特定于平台的原因,那就没问题了。

确切的16位,32位和64位类型在技术上也是可选的,但如果实现具有合适的整数类型,则它们必须存在。 “合适”不仅意味着存在精确的N位无符号类型而没有填充位,而且相应的带符号类型没有填充位并使用2的补码表示。在实践中,这是如此接近于任何地方,你通过使用它们中的任何一个来限制可移植性。为了获得最大的可移植性,您应优先使用unsigned intuint_least32_t而不是uint_fast32_t。哪一个取决于您是否更关心速度或尺寸。根据我的经验,很少有人会烦恼,因为没有32位整数类型的平台已经非常奇怪,大多数人都不关心他们的代码是否运行。

答案 1 :(得分:14)

uint32_t仅在平台支持32位宽且无填充的无符号整数类型时才存在。

uint32_least_t始终存在,是一个至少32位的无符号整数类型,它是最小的类型。

uint32_fast_t也始终存在,并且是一个至少32位的整数类型,它是平台的“最自然”类型,即操作生成最有效代码的类型。

注意:签名版本int32_t也需要2的补码表示。