我在
stdint.h
中看到了整数的不同类型的定义。我将以无符号 32 位整数为例。
uint32_t
明确表示 32 位无符号整数。我一直用的就是这个。uint_fast32_t
和 uint_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; };
我说得对吗?并且,您会建议我对 48 位无符号整数使用
uint48_t
还是应该使用普通 uint64_t
?
谢谢您的解释。
与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 short
和 unsigned int
。或者,它可以是扩展类型(即,实现提供的整数类型不是标准中定义的任何整数类型)。
您会建议我对 48 位无符号整数使用 uint48_t 吗?
如果它存在并且是您想要的大小,那么您不妨使用它。但是,它不会存在于很多实现中,因此它仅适合在不可移植代码中使用。没关系,只要您必须处理精确的 48 位整数的原因是特定于平台的。
确切的 16、32 和 64 位类型在技术上也是可选的,但如果实现具有合适的整数类型,则需要它们存在。 “合适”不仅意味着存在精确的N位无符号类型且没有填充位,而且还意味着对应的有符号类型没有填充位并且使用2的补码表示。实际上,这与任何地方都非常接近,因此使用它们中的任何一个都几乎不会限制可移植性。为了获得最大的便携性,您应该优先使用
uint_least32_t
或 uint_fast32_t
而不是 uint32_t
。哪一个取决于你更关心速度还是大小。根据我的经验,很少有人会打扰,因为没有 32 位整数类型的平台已经很奇怪,以至于大多数人不关心他们的代码是否在其上运行。
std::uint32_t
仅当平台支持正好 32 位宽且无填充的无符号整数类型时才存在。
std::uint_least32_t
始终存在,是至少 32 位的无符号整型,并且是最小的此类类型。
std::uint_fast32_t
也始终存在,并且是至少 32 位的整数类型,并且它是平台的“最自然”类型,即操作生成最高效代码的类型。
注意:带符号的版本,
std::int32_t
,也需要 2 的补码符号表示。