uint32_t vs uint_fast32_t vs uint_least32_t

问题描述 投票:0回答:2

我在

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

  1. uint32_t
    明确表示 32 位无符号整数。我一直用的就是这个。

  2. 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

谢谢您的解释。

c++ c++11 integer stdint
2个回答
29
投票

与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 位整数类型的平台已经很奇怪,以至于大多数人不关心他们的代码是否在其上运行。


20
投票

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

std::uint_least32_t
始终存在,是至少 32 位的无符号整型,并且是最小的此类类型。

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

注意:带符号的版本,

std::int32_t
,也需要 2 的补码符号表示。

© www.soinside.com 2019 - 2024. All rights reserved.