如何解决未签名的字符超出范围
我正在尝试找出如何在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)返回以下两个警告:
我不太明白这两句话在说什么,但是我认为它必须使用变量j
超过unsigned char
的极限值(即255)(在上一次迭代{{1} },这是不允许/未定义的)。
但是,此代码将被编译并按预期工作。但是我仍然想编写和理解一个为端口C分配255而不输入“禁止”值范围的代码。
* P.S。我可以使用j = 256
或unsigned 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 举报,一经查实,本站将立刻删除。