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

时间:2016-02-29 04:24:08

标签: c type-conversion c99

三天前我读了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&amp;和uint_fast8_t和“{至少8位宽”是什么意思for(u16 i=0;i<counter;i++) { Increment_Counter++; } 。例如,让我们看一下代码片段

counter =0xFF

这里: - u16表示无符号短。 counter和Increment_Counter是两个变量

counter =0x01FF; Increment_Counter可以通过任何类型的关键字声明正常工作。 现在uint_least8_t;我应该选择什么样的声明? uint_fast8_t(保证至少8位宽)或unit16类型?

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

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

我抓住了我的怀疑,却一无所获。所以任何帮助都会非常感激。

提前致谢

1 个答案:

答案 0 :(得分:3)

  

1)说“至少8位宽”是什么意思

这意味着编译器会将此映射到适合您的目标的类型,但您对此类型的唯一保证是它至少为8位。您的担忧不应局限于“我应该使用哪种类型来保护后增量” - 您应该专注于这8位内的合理用法。

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

  

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

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

  

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

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

一般来说,如果你已经足够提出这些问题了,那么只要目睹在这些条件下生成的不同代码,你就可能获得更多。在所有可能的情况下,通过测量每个的性能和内存消耗,您将获得良好的服务。