无符号字符超出范围

Unsigned char out of range

我想弄清楚,如何在 for 循环中使用 unsigned char 类型的变量,同时又不“超出”unsigned char 的范围,这可以从 0 到 255 变化。

    main(void) {
        TRISC = 0;
        LATC = 0;
        unsigned char j;
    
        for (j = 0; j <= 255 ; j++){
            LATC = j;
            __delay_ms(1000);
        }
        return;
    }

这是C语言的代码,PIC就是在这里编程的。 “TRISC = 0”表示将端口 C 设置为输出,“LATC”指的是端口 C 本身。基本上我想为这个端口分配从 0 到 255 的值。但是如果我尝试编译它,编译器 (xc8) returns 会出现两个警告:

我不太明白这两个在说什么,但我认为它必须对变量 j 做一些事情超过 unsigned char 的限制值,即 255(在上一次迭代中 j = 256,不是 allowed/defined)。 但是,此代码已编译并按预期工作。但我仍然想编写并理解一个代码,它在不输入“禁止”值范围的情况下为端口 C 分配值 255。

*P.S。我会使用 unsigned charchar 以外的任何其他变量类型,但是对于 PIC 中的端口,只能直接应用这两种类型(无需转换)。

如果 j 只有 8 位宽,

j <= 255 始终为真。

这个版本应该可以工作:

main(void) {
    TRISC = 0;
    LATC = 0;
    int j;

    for (j = 0; j <= 255 ; j++){
        LATC = (unsigned char)j;
        __delay_ms(1000);
    }
    return;
}

首先,在微控制器固件中,你不应该return来自main()。您的 main() 应该包含某种无限循环。

j <= 255 对于 uint8_t 变量始终为真。因为j不可能是256,j是255的时候加1,结果是0,不是256.

正如其他人所建议的那样,使用 16 位整数(有符号或无符号)是最简单和最干净的方法。但是,在对性能敏感的循环中,您可能更愿意坚持使用 8 位循环计数器,因为它们是 8 位 PIC 微控制器最快的循环计数器。

这个特定的一次性循环可以写成:

uint8_t j = 0;
do {
    LATC = j++;
    __delay_ms(1000);
} while (j != 0);