三天前我读了一篇 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_t
和 uint_fast8_t
说“至少 8 位宽”到底是什么意思。例如,让我们看一下代码片段
for(u16 i=0;i<counter;i++)
{
Increment_Counter++;
}
这里:- u16 表示无符号短整型。 counter 和 Increment_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"
这意味着编译器会将其映射到适合您的目标的类型,但您对该类型的唯一保证是它至少为 8 位。您的关注不应仅限于“我应该创建什么类型的索引来保护后增量”的问题——您应该只关注这 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
那样优化速度,因此寄存器宽度和其他寄存器宽度之间可能存在不同的平衡。
一般来说,如果您已经足够深入地提出这些问题,您可能会通过见证在这些条件下生成的不同代码而获益匪浅。并且很可能您会通过测量每个的性能和内存消耗得到很好的服务。
关于c - 固定宽度、最小宽度和最快最小宽度无符号 8 位整数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35691952/