Answers:
int
在某些平台上可能只有16位。对于您的应用程序可能还不够。uint32_t
不保证存在。如果typedef
实现具有正好为32位的无符号整数类型,则实现必须提供此选项。例如,有些具有9位字节,因此没有uint32_t
。uint_fast32_t
清楚说明您的意图:从性能的角度来看,这是至少 32位的类型,这是最好的。uint_fast32_t
实际上可能是64位长。这取决于实现。...
uint_fast32_t
具有与uint32_t
... 相同的typedef
您正在寻找的不是标准。这是一个特殊的实现(BlackBerry)。因此,您无法从那里推论出uint_fast32_t
总是与相同的推论uint32_t
。
也可以看看:
uint_least32_t
,uint_fast32_t
除了它偏爱较小的存储而不是速度之外,这是相同的。
区别在于它们的准确性和可用性。
这里的文档说:
无符号整数类型,其宽度分别恰好为8、16、32和64位(仅在实现直接支持type时提供):
uint8_t uint16_t uint32_t uint64_t
和
最快的无符号无符号整数类型,宽度分别至少为 8、16、32和64位
uint_fast8_t uint_fast16_t uint_fast32_t uint_fast64_t
因此,非常明显的区别是这uint32_t
是一种具有完全 32
位的类型,并且实现只有在其具有恰好 32位的类型时才应提供它,然后可以将该类型的类型定义为uint32_t
。这意味着,uint32_t
可能会或可能不会使用。
在另一方面,uint_fast32_t
是具有类型至少 32位,这也意味着,如果一个实施方式可以的typedef uint32_t
为uint_fast32_t
如果它提供uint32_t
。如果不提供uint32_t
,则uint_fast32_t
可以是至少具有32
位的任何类型的typedef 。
uint32_t
在所有系统上都是32位(如果存在),与拥有64位的系统相比可能并不快。 uint_fast32_t
另一方面,至少 32位甚至可以是64位。
uint16_t x;
将其存储在ARM7-TDMI的32位寄存器中,则代码x++;
可能需要评估为x=((x+1)<<16)>>16);
。在用于该平台的编译器上,uint_fast16_t
很可能将其定义为与之uint32_t
避免的同义词。
[u]int_(fast|least)N_t
还不可选?当然,不是标准要求所有架构都支持至少64位的原始类型吗?然而,措辞stdint.h
暗示他们必须这样做。对我来说,我们一直在强制执行自1999年以来,即64位计算成为主流之前的几年-不用说落后于嵌入式体系结构(在许多情况下仍是当前)的滞后。对我来说,这似乎是一个很大的疏忽。
当你#include inttypes.h
在你的程序,你可以访问一堆为代表的整数不同的方式。
uint_fast * _t类型仅定义用于表示给定位数的最快类型。
这样考虑:定义一个类型变量,short
并在程序中多次使用它,这是完全有效的。但是,您正在使用的系统使用type值可能会更快地工作int
。通过将变量定义为type uint_fast*t
,计算机可以简单地选择可以使用的最有效的表示形式。
如果这些表示之间没有区别,则系统选择所需的任何一种,并在整个过程中始终使用。