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

标签 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_tuint_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/

相关文章:

c - open() 如何有两个定义,如手册页所示?

c++ - 如何从输入文件中读取带有 argv 和重定向的输入文件

c++ - 从 char** 到 const char** 的隐式转换

c - 在传统的 Linux fork-exec 中使用 _exit() 和 exit() 有什么区别?

java - 数字提升仅适用于算术运算符?

c - 如何使用终端在 gcc 中启用 c99 模式

c - C的智能指针/安全内存管理?

python - 将整数转换为数字列表

java - Spring MVC 转换方法

C99:为什么我的字符串改变了?