固定宽度、最小宽度和最快最小宽度无符号 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_t
和 uint_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
那样优化速度,因此寄存器宽度和其他寄存器宽度之间可能存在不同的平衡。
一般来说,如果您已经足够深入地提出这些问题,那么您可能会通过见证在这些条件下生成的不同代码而获益匪浅。并且很可能通过测量每个的性能和内存消耗来为您提供很好的服务。
三天前我读了一篇 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
说 "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
那样优化速度,因此寄存器宽度和其他寄存器宽度之间可能存在不同的平衡。
一般来说,如果您已经足够深入地提出这些问题,那么您可能会通过见证在这些条件下生成的不同代码而获益匪浅。并且很可能通过测量每个的性能和内存消耗来为您提供很好的服务。