C语言 为什么这个条件总是成立?

wmtdaxz3  于 2023-04-29  发布在  其他
关注(0)|答案(4)|浏览(88)

语言:C PIC:16F84A程序:CCS PCW
当我编译下面的代码时,我的编译器抱怨FOR总是为真(也许int i不支持负值?):

#include <16F84A.h>
#FUSES XT
#use delay(clock=4M)
byte const display[10] = {63,6,91,79,102,109,124,7,127,103};

void main()
{
   set_tris_b(0);
   while(True)
   {
   int i;
      for(i=9;i>=0;--i)
      {
         output_b(display[i]);
         delay_ms(300);
      }
   }
}

它的PIC Countdown项目,所以:9,8,7,6,5,4,3,2,1,0,9,8,7,6,5,4,3,2,1,0,9,8,7,6,...但在第一个周期后停止。

6l7fqoea

6l7fqoea1#

使用

signed int i;

而不是

int i;

在CCS编译器中,整数默认是无符号的。
http://www.ccsinfo.com/downloads/ccs_c_manual.pdf
检查第38页
“所有类型,除了float,默认都是无符号的;然而,[它们]可以是没有签名或签名的。

vaqhlq81

vaqhlq812#

你的编译器要么坏了,要么是一些非标准的垃圾,其中int默认是无符号的。
我建议使用真实的的、符合C编译器。

anhgbhbe

anhgbhbe3#

检查一下编译器生成的汇编代码,你就会知道了。或者在这里发布,这样我们就不必拥有/安装特定的编译器。好的想法与汇编(特别是在死简单的微型像PIC 16)是,它永远无法隐藏它实际上做什么:-)
我同意这里关于一些工具质量的一些评论,Microchip从来没有自己的PIC 16 C编译器,所以我们不能责怪他们:

9avjhtql

9avjhtql4#

我只是弄清楚它与for条件和递减for上的变量类型有关。

  • 使用变量类型为signed int 8或signed int 16,
  • 停止条件将其设置为i〉-1;

这将删除警告,代码将正常运行。

...
#include <16f84a.h>
#fuses XT, NOWDT
#use delay(clock=4000000)

void main(){
    set_tris_b(0x00);
    output_b(0x00);
    signed int16 i, unid, dec, dato;
    while(true){
        for(i=99; i>-1; i--){
            dec = i/10;
            unid = i - (dec*10);
            dato = (dec<<4) + unid;
            output_b((int8)dato);
            delay_ms(50);
       }
   }
}
...

相关问题