Utilizzando funzioni binarie, senza utilizzare gli operatori +, - e * ad eccezione dei cicli, devo realizzare una funzione che effettui la somma algebrica di due numeri, sto usando gcc su linux.
Non badate alla funzione mult che devo ancora scrivere.La funzione fullAdder implementa un full adder a 3 bit, funziona correttamente.
Sfruttando un full adder devo implementare la funzione wordAdder che cioè fa la somma bit per bit e ritorna il numero totale.
Questa funzione da risultati esatti solo con numeri positivi, ma sbaglia se c'è un solo numero negativo tra gli addendi, entra in un loop infinito.
Non ci sono errori di compilazione ne avvisi.
codice:
void fullAdder( int A, int B, int Cin, int *out);
int wordAdder( int X, int Y, int *out);
int mult(int X, int Y);

/* Funzione principale */

int main (int argc,char **argv)
{
    int *carry;
    carry=(int*)calloc(2,sizeof(int));
    if(carry==NULL)
    {
        printf("Errore di allocazione della memoria.\n");
        return -1;
    }
    printf("%d",wordAdder(8,12,carry));
    return 0;
}


void fullAdder( int A, int B, int Cin, int *out)
{
    out[0]=0;
    out[1]=0;
    out[0]=(A^B^Cin)|(A&B&Cin);
    out[1]=(B&Cin)|(A&(B^Cin));
    out[0]=out[0]&1;
    out[1]=out[1]&1;
}
int wordAdder( int X, int Y, int *out)
{
    int i=0,result=0,carry=0;
    while(X!=0 || Y!=0)
    {
        fullAdder(X,Y,carry,out);
        carry=out[1];
        out[0]=out[0]<<i;
        result=result^out[0];
        Y=Y>>1;
        X=X>>1;
        i++;
    }
    *out=carry;
    if(carry==1)
    {
        carry=carry<<i;
        result=result^carry;
    }
    return result;
}
int mult(int X, int Y)
{
    return 0;
}
Ad esempio nella main è presente questa riga:
codice:
printf("%d",wordAdder(8,12,carry));
L' output è 20, e risulta corretta per tutti i numeri positivi,ma se nella riga della printf provo a cambiare i valori così:
codice:
printf("%d",wordAdder(-8,12,carry));
Semplicemente non da risultati, il programma non si ferma mai, entra in un loop infinito e mi tocca chiudere la finestra di debug.Non capisco come mai
Ho provato su carta e penna a fare i conti per capire come mai entra in un loop infinito,ma mi sembra non ci siano errori.