【问题标题】:uint32_t vs uint_fast32_t vs uint_least32_tuint32_t vs uint_fast32_t vs uint_least32_t
【发布时间】:2013-11-15 18:27:27
【问题描述】:

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

  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

感谢您的解释。

【问题讨论】:

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


【解决方案1】:

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

【讨论】:

  • "uint32_t是至少32位的最小类型",你的意思是uint32_least_t?
  • 我以前不敢用这些类型,但是有了这个详细的答案,我得到了我需要的所有解释。谢谢!
【解决方案2】:

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

uint32_least_t一直存在,是至少32位的无符号整数类型,是此类类型中最小的一个。

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-04-08
    • 2016-08-17
    • 1970-01-01
    • 2014-08-17
    • 2011-09-18
    • 1970-01-01
    • 2012-07-27
    相关资源
    最近更新 更多