TODOPIC

Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: ramirez en 05 de Mayo de 2009, 13:33:27

Título: Diferencia entre char y signed char
Publicado por: ramirez en 05 de Mayo de 2009, 13:33:27
Buenas tardes a todos, estoy empezando a aprender a programar pic's en C. He comenzado con varios programas básicos de este foro y me surge la siguiente duda: que diferencia existe entre "char" y "signed char", ya que al cambiarlo en el siguinte programa la forma de actuar es muy difente:

#include <16f648a.h>            //pic a utilizar          
#fuses XT,NOWDT,NOPROTECT,PUT,NOLVP      //ordenes para el programador
#use delay (clock=4000000)         //Fosc=4Mhz
#use standard_io(B)               //puerto B

///PROGRAMA
void main(void)
{
   signed char i;      //variable indice
   int leds[4]={0b10000001,0b01000010,0b00100100,0b00011000}; //led's      
                  
   set_tris_b(0x00);            //portb como salida
   disable_interrupts(GLOBAL);      //todas las interrupciones desactivadas
   
   do{                        //bucle...
      
      for(i=0;i<4;i++){         //led's on fuera-dentro
         output_b(leds);      //ilumino led's correspondientes
         delay_ms(100);
         }
      for(i=3;i>-1;i--){         //led's on dentro-fuera
         output_b(leds);      //ilumino led's correspondientes
         delay_ms(100);
         }
         
      }while(TRUE);            //...infinito
}

para que funcione correctamente debe de ponerse "signed char" ¿porqué?

Gracias a todos de antemano
Título: Re: Diferencia entre char y signed char
Publicado por: migsantiago en 05 de Mayo de 2009, 13:40:06
En CCS todos los tipos de variables son unsigned de forma predeterminada (int8 equivale a unsigned int8). Es necesario que pongas signed char para que abarque valores negativos.

char se crea como unsigned int8 (0 a 255)
signed char se crea como signed int8 (-128 a 127)
Título: Re: Diferencia entre char y signed char
Publicado por: gera en 05 de Mayo de 2009, 14:08:36
Y creo q la razon por la cual no funciona tu codigo esta aca:
      for(i=3;i>-1;i--){         //led's on dentro-fuera
Si i esta expresado como unsigned char, entonces no se puede hacer la comparacion i>-1, ya que para esto el compilador resta ambos numeros, y un numero negativo se expresa de forma binaria a uno positivo (ya sea complemento a 2 o como quieran).
Las posibles soluciones serian:
      for(i=3;i>=0;i--){         //led's on dentro-fuera
o
      for(i=3;(signed char)i>-1;i--){         //led's on dentro-fuera
no lo he probado y no se si funciona, pero creeria q si
saludos!!!