uint32_t vs uint_fast32_t vs uint_least32_t

Gab*_* L. 16 c++ integer stdint c++11

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

  1. uint32_t清楚地表示32位的无符号整数.这就是我经常使用的那个.

  2. uint_fast32_tuint_least32_t:有什么区别,什么uint32_t时候应该使用它们而不是uint32_t

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

struct uint24_t { unsigned int the_integer : 24; };
Run Code Online (Sandbox Code Playgroud)

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

谢谢你的解释.

Ste*_*sop 22

与uint32_t的区别是什么

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

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

uint32_t 如果存在任何这样的类型,则是没有填充的正好32位的类型.

我对吗?

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

由于unsigned long需要为至少32位,唯一的标准类型的uint24_t可能可能永远是一个别名是char,unsigned char,unsigned shortunsigned int.或者,它可以是扩展类型(即,由实现提供的整数类型,不是标准中任何定义的整数类型).

你会建议我使用uint48_t作为我的48位无符号整数吗?

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

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


Ker*_* SB 14

uint32_t 仅当平台支持正好为32位宽并且没有填充的无符号整数类型时才存在.

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

uint32_fast_t 也总是存在并且是至少32位的整数类型,并且它是平台的"最自然"类型,即操作生成最有效代码的类型.

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