固定宽度、最小宽度和最快最小宽度无符号 8 位整数

Fixed width, minimum width and fastest minimum width unsigned 8 bit integer

三天前我读了一篇 article on choosing correct integer size。在阅读本文之前,我并不知道这三个关键字,即:

1) 固定宽度无符号 8 位整数:uint8_t。 (Typedef 是 C99 投诉)

2) 最小宽度无符号8位整数:uint_least8_t.

3) 最快最小宽度无符号8位整数:uint_fast8_t.

所以我的问题是:

1) uint_least8_tuint_fast8_t 说 "at least 8 bits wide" 到底是什么意思?例如,让我们看一下代码片段

for(u16 i=0;i<counter;i++)
{
  Increment_Counter++;
}

此处:- u16 表示无符号短整型。 counter 和 Increment_Counter 是两个变量

counter =0xFF; Increment_Counter 适用于任何类型的关键字声明。 现在 counter =0x01FF;我应该选择什么样的声明? uint_least8_t(谁保证至少8位宽)还是unit16类型?

2) 选择uint_fast8_t如何影响代码速度。

3) 选择 uint_least8_t 如何比 unsigned char 消耗更少的数据内存。

我提出了我的疑虑,但一无所获。因此,我们将不胜感激任何帮助。

提前致谢

1) What exactly they mean by saying "at least 8 bits wide"

这意味着编译器会将其映射到适合您的目标的类型,但您对该类型的唯一保证是它至少为八位。您的关注不应仅限于 "What type should I make this index that guards a postincrement" 的问题——您应该关注这 8 位中的正常使用。

所以,是的,要注意溢出,但要认真考虑它是否对您的设计有意义。例如,这与用户输入有什么关系吗?或者我们是否在计算您设计中的一些静态元素?假设声明了 uint_fast8_t framistan_modules 来计算 "framistan" 函数的数量。您只定义了 3 个,您无法想象为什么需要超过 5 个。

2) How choosing uint_fast8_t affects the code speed.

如果没有经验指标,很难对代码速度做出任何评价。但是这种类型背后的想法是我的编译器可能会为 uint_fast8_t 选择寄存器宽度类型,即使我的寄存器明显大于 8 位。

3) How choosing uint_least8_t consumes lesser data memory than unsigned char.

不太可能不可能。但是,它与 _fast8_t 的相似之处在于您为编译器提供了一定程度的自由(不仅仅是 8 位)。这里的区别在于您没有像 fast 那样优化速度,因此寄存器宽度和其他寄存器宽度之间可能存在不同的平衡。


一般来说,如果您已经足够深入地提出这些问题,那么您可能会通过见证在这些条件下生成的不同代码而获益匪浅。并且很可能通过测量每个的性能和内存消耗来为您提供很好的服务。