【发布时间】:2015-02-03 22:18:05
【问题描述】:
所以我只是想用 0-255 的连续数字填充缓冲区。我没有多想,最终陷入了无限循环。
uint8_t i;
uint8_t txbuf[256];
for (i=0; i<256; i++) {
txbuf[i] = i;
}
问题在于i 永远不会是 256,因为它会在 255 之后归零。
我的问题是,有没有办法在不将i 提高到 16 位值的情况下执行此循环?
注意:我知道我可以将循环更改为 i<255 并在最后一个位置添加另一行,但我试图找出一种更好看的方式。
【问题讨论】:
-
不要使用 8 位
i。由于uint8_t只能具有值 0...255,因此i < 256将始终为真。使用常规的int作为循环计数器,并在分配时删除额外的位。 -
接受的答案适用于 8 位值。
-
如果想在0次迭代后就可以结束循环,256次后就不能结束了,反之亦然。 0 到 256 = 257。
-
没错,但我认为这是个坏习惯。循环索引通常应该总是简单的
int,除非有一些令人信服的理由他们不能这样做。例如,在 ARM 上,接受的代码必须进行大量额外的屏蔽,因为它只能进行 32 位的获取和存储。 -
int必须至少有 16 位,因此在这种情况下没有理由使用uint8_t。在大多数情况下,使用本机宽度变量通常会比 8 位变量快(数组除外)stackoverflow.com/q/163254/995714stackoverflow.com/q/5069489/995714softwareengineering.stackexchange.com/q/144792/98103 即使在 8 位世界中,智能编译器也会优化循环for (int i = 0; i < 256; i++)任何 16 位数学的使用,例如 32 位编译器 iterates over all unsigned integers