21

我看到了不同类型的整数定义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; };

我对吗 ?而且,你会建议我使用uint48_t我的 48 位无符号整数还是应该使用普通的uint64_t

感谢您的解释。

4

2 回答 2

25

与 uint32_t 有什么区别

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

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

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

我对吗?

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

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

你会建议我将 uint48_t 用于我的 48 位无符号整数吗?

如果它存在并且是您想要的大小,那么您不妨使用它。但是,它不会在很多实现中存在,因此它只适用于不可移植的代码。没关系,前提是您必须处理精确的 48 位整数的原因是特定于平台的。

确切的 16、32 和 64 位类型在技术上也是可选的,但如果实现具有合适的整数类型,则它们必须存在。“合适”不仅意味着有一个精确的 N 位无符号类型没有填充位,而且对应的有符号类型没有填充位并使用 2 的补码表示。实际上,这几乎无处不在,以至于您通过使用其中任何一个都很少限制可移植性。尽管您应该使用uint_least32_tuint_fast32_t优先使用uint32_t. 哪一个取决于您是否更关心速度或大小。根据我的经验,很少有人会打扰,因为没有 32 位整数类型的平台已经很奇怪,以至于大多数人都不关心他们的代码是否在上面运行。

于 2013-11-04T23:58:38.553 回答
17

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

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

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

注意:带符号的版本,int32_t,也需要 2 的补码表示。

于 2013-11-05T00:01:19.460 回答