Ciao, ho un problema in cui non so dove sbattere la testa. Ecco il testo:
"Si sviluppi un programma in linguaggio C che acquisisca in ingresso due numeri binari di 8
bit e li memorizzi in due vettori num1 e num2. Successivamente ne faccia la somma
algebrica interpretandoli come numeri rappresentati in complemento a due, ponendo il
risultato (rappresentato in complemento a due) in un vettore somma e segnalando all’utente
se c’è stato overflow."
Ecco il mio codice:
codice:
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
/* vettori da utilizzare */
int num1[8];
int num2[8];
int somma[8];
/* creazione di due variabili: riporto e "nona posizione": "nona posizione" sarà il riporto dell'ultimo bit */
int carry=0, nona_posizione=0;
/* variabile ciclo */
int i;
/* acquisizione primo numero */
printf("Inserire in formato binario, il primo numero: \n");
for(i=0; i<8; i++)
{
printf("%d° numero da destra: ", (i+1));
scanf("%d", &num1[i]);
}
printf("*** FINE ACQUISIZIONE PRIMO NUMERO ***\n");
/* acquisizione secondo numero */
printf("Inserire in formato binario, il secondo numero: \n");
for(i=0; i<8; i++)
{
printf("%d° numero da destra: ", (i+1));
scanf("%d", &num2[i]);
}
printf("*** FINE ACQUISIZIONE SECONDO NUMERO *** \n");
/* esecuzione somma */
for(i=0; i<=8; i++)
{
/* ora i vari controlli: se 0 e 0 e carry=0 => 0 e carry=0
se 0 e 1 e carry=0 => 1 e carry=0
se 1 e 0 e carry=0 => 1 e carry=0
se 1 e 1 e carry=0 => 0 e carry=1
----
se 0 e 0 e carry=1 => 1 e carry=0
se 0 e 1 e carry=1 => 0 e carry=1
se 1 e 0 e carry=1 => 0 e carry=1
se 1 e 1 e carry=1 => 1 e carry=1
quando i=7 e carry=1, porremo nona_posizione=1
*/
if(i!=8)
{
/* 1 */
if(((num1[i]==0) && (num2[i]==0)) && (carry==0))
{
somma[i]=0;
carry=0;
/*printf("-> 0");*/
}
/* 2 */
if(((num1[i]==0) && (num2[i]==1)) && (carry==0))
{
somma[i]=1;
carry=0;
}
/* 3 */
if(((num1[i]==1) && (num2[i]==0))&& (carry==0))
{
somma[i]=1;
carry=0;
}
/* 4 */
if(((num1[i]==1) && (num2[i]==1)) && (carry==0))
{
somma[i]=0;
carry=1;
}
/* 5 */
if(((num1[i]==0) && (num2[i]==0)) && (carry==1))
{
somma[i]=1;
carry=0;
}
/* 6 */
if(((num1[i]==0) && (num2[i]==1)) && (carry==1))
{
somma[i]=0;
carry=1;
}
/* 7 */
if(((num1[i]==1) && (num2[i]==0)) && (carry==1))
{
somma[i]=0;
carry=1;
}
if(((num1[i]==1) && (num2[i]==1)) && (carry==1))
{
somma[i]=1;
carry=1;
}
}
else
{
if(carry == 1)
{ nona_posizione=1; }
}
} /* fine ciclo */
/* scrittura del risultato */
printf("Il risultato è: ");
for(i=7; i>=0; i--)
{
printf("%d", somma[i]);
}
printf("\nE' stato rilevato overflow? ");
/* controllo per overflow */
if(carry==nona_posizione)
{ printf("No \n"); }
else { printf("Si \n"); }
system("PAUSE");
return 0;
}
Provando inserendo come num1: 00000001 e num2:00000001 ottengo come risultato: 00000011
perché???
è un errore logico ma qualcosa mi sfugge!!! per me è in qualche ciclo for e non penso ad istruzioni logiche ma non sono proprio sicuro