使用8位无符号整数变量作为计数器循环超过256个值

时间:2014-12-05 17:04:39

标签: c loops

所以我只是试图填充连续数字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并为最终位置添加另一行,但我试图找出一种更好看的方式。

6 个答案:

答案 0 :(得分:10)

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--);

答案 1 :(得分:5)

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

uint8_t i = 0;
uint8_t txbuf[256];

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

答案 2 :(得分: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;
    }

}

答案 3 :(得分:2)

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

只需将支票保留为i<255,当您退出循环时,您知道i的值为255,请相应地使用它。

否则按其他人的建议使用do while

答案 4 :(得分:1)

以下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

的更多详情

答案 5 :(得分:0)

考虑一下:

uint8_t txbuf[256];
uint8_t i = 0;

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

该代码允许更改类型。