未签名的字符超出范围

问题描述

我正在尝试找出如何在unsigned char循环内使用for类型的变量,而不会“超出” 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)返回以下两个警告:

enter image description here

enter image description here

我不太明白这两句话在说什么,但是我认为它必须使用变量j超过unsigned char的极限值(即255)(在上一次迭代{{1} },这是不允许/未定义的)。 但是,此代码将被编译并按预期工作。但是我仍然想编写和理解一个为端口C分配255而不输入“禁止”值范围的代码

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

解决方法

如果j <= 255只有8位宽,则

j始终为真。

此版本应工作:

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

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

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

j <= 255对于uint8_t变量始终为true。因为j不能为256。将j加为255时将1加1使其变为0,而不是256。

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

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

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