我在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; };
我是对的吗?并且,您是否建议我使用uint48_t
作为我的48位无符号整数,还是应该使用正常的uint64_t
?
感谢您的解释。
答案 0 :(得分:21)
与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
,{{ 1}}和unsigned short
。或者,它可以是扩展类型(即,实现提供的整数类型,不是标准中任何已定义的整数类型)。
您是否建议我将uint48_t用于我的48位无符号整数?
如果它存在并且是您想要的大小,那么您也可以使用它。但是,它不会存在于很多实现中,因此它仅适用于非可移植代码。如果您必须处理精确的48位整数是特定于平台的原因,那就没问题了。
确切的16位,32位和64位类型在技术上也是可选的,但如果实现具有合适的整数类型,则它们必须存在。 “合适”不仅意味着存在精确的N位无符号类型而没有填充位,而且相应的带符号类型没有填充位并使用2的补码表示。在实践中,这是如此接近于任何地方,你通过使用它们中的任何一个来限制可移植性。为了获得最大的可移植性,您应优先使用unsigned int
或uint_least32_t
而不是uint_fast32_t
。哪一个取决于您是否更关心速度或尺寸。根据我的经验,很少有人会烦恼,因为没有32位整数类型的平台已经非常奇怪,大多数人都不关心他们的代码是否运行。
答案 1 :(得分:14)
uint32_t
仅在平台支持32位宽且无填充的无符号整数类型时才存在。
uint32_least_t
始终存在,是一个至少32位的无符号整数类型,它是最小的类型。
uint32_fast_t
也始终存在,并且是一个至少32位的整数类型,它是平台的“最自然”类型,即操作生成最有效代码的类型。
注意:签名版本int32_t
也需要2的补码表示。