无符号字符超出范围
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 char
或 char
以外的任何其他变量类型,但是对于 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);
我想弄清楚,如何在 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 char
或 char
以外的任何其他变量类型,但是对于 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);