【问题标题】:Loop over 256 values using 8-bit unsigned integer variable as counter使用 8 位无符号整数变量作为计数器循环 256 个值
【发布时间】: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&lt;255 并在最后一个位置添加另一行,但我试图找出一种更好看的方式。

【问题讨论】:

  • 不要使用 8 位 i。由于 uint8_t 只能具有值 0...255,因此 i &lt; 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 &lt; 256; i++)任何 16 位数学的使用,例如 32 位编译器 iterates over all unsigned integers

标签: c loops


【解决方案1】:
uint8_t txbuf[256];
uint8_t i = 0;

do {
   txbuf[i] = i;  
} while (i++ != 255);

或

uint8_t txbuf[256];
uint8_t i = 255; 

do {
   txbuf[i] = i;  
} while (i--);

【讨论】:

  • 非常好!由于根据 C99 标准第 6.2.5.9 节,无符号变量不能溢出,因此行为定义良好。
【解决方案2】:

使用do ... while 循环,以便在检查条件之前执行操作:

uint8_t i = 0;
uint8_t txbuf[256];

do {
    txtbuf[i] = i;
} while(i++ < 255);

【讨论】:

  • 我认为最好注意在循环结束时 i==0 但是只有在循环中有 break 并且您想跟踪断点处的索引。
【解决方案3】:

其他答案中的 do..while 循环可能是您想要的,但如果您特别想使用 for 循环,您可以添加一个 break 语句:

uint8_t i;
uint8_t txbuf[256];

int main(void)
{

    for (i=0; ; i++) {
        txbuf[i] = i;
        if (i == 255) break;
    }

}

【讨论】:

    【解决方案4】:

    uint8_t 的范围是 0-255,所以它永远不会变成 256。 由于我们看到您的数组也是 uint8_t 类型,因此它可以存储的值也是 0-255,那么是什么让您循环查找大于 255 的值?

    只要保持你的支票为i&lt;255,当你退出循环时你知道i的值为255,相应地使用它。

    其他人建议使用do while。

    【讨论】:

      【解决方案5】:

      下面的 gcc (5.0) 有一个检查是否发生溢出的功能。

      uint8_t i = 0;
      uint8_t txbuf[256];
      
      do
      {
          txbuf[i] = i;
      }while(!__builtin_add_overflow(i,1,i));
      

      更多详情https://gcc.gnu.org/gcc-5/changes.html

      【讨论】:

        【解决方案6】:

        考虑一下:

        uint8_t txbuf[256];
        uint8_t i = 0;
        
        do {
            txtbuf[i] = i;
        } while(++i != 0);
        

        代码允许更改类型。

        【讨论】:

          猜你喜欢
          • 2013-11-26
          • 2020-10-30
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-03-30
          • 2019-03-22
          • 2015-07-19
          相关资源
          最近更新 更多