微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

未签名的字符超出范围

如何解决未签名的字符超出范围

我正在尝试找出如何在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);

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。