Funktionierender 4 Bit Volladdiere in C?

Slevi89  29.11.2023, 13:56

Was ist jetzt genau die Frage?

ByKryptox973 
Fragesteller
 29.11.2023, 14:34

Also das Programm funktioniert nicht wie es soll. Es sollen zwei Zahlen angegeben werden und diese sollen dann verrechnet werden zusätzlich soll der Übertrag korrekt angezeigt werd

1 Antwort

Die Berechnung des Übertrags stimmt nicht. Der Übertrag ist das Ergebnis der Addition der beiden Bits an der rechten Stelle. In deinem Programm wird der Übertrag jedoch berechnet, indem die beiden Zahlen multipliziert werden.

int uebertrag = (a & b) | ((a ^ b) & (a ^ (a + b)));

hätte es sowieso anders geschrieben, möchte jetzt aber nicht deinen ganzen code umändern, versuchs erst mal so.

#include <stdio.h>



void printBinary(int num, int bits) {
  for (int i = bits - 1; i >= 0; i--) {
    printf("%d", (num >> i) & 1);
  }
}


int main() {

  int a, b;
  printf("\n");
  printf("\n");


  
  printf(" Tippe deine erste Zahl zwischen 0 und 15 ein: ");
  scanf("%d", &a);


 
  if (a < 0 || a > 15) {
    printf("Error: Zahl liegt nicht zwischen 0 und 15\n");
    printf("  Programm beendet...\n");
    return 1; 
  }


  
  printf("Tippe deine zweite Zahl zwischen 0 und 15 ein ");
  scanf("%d", &b);


  
  if (b < 0 || b > 15) {
    printf("Error: Zahl liegt nicht zwischen 0 und 15\n");
    printf("  Programm beendet...\n");
    return 1; 
  }
  printf("\n");


 
  int summe = a + b;
  int uebertrag = (a & b) | ((a ^ b) & (a ^ (a + b)));


  
  printf(" ");
  printBinary(a, 5);
  printf(" (x)\n");


  printf("+ ");
  printBinary(b, 5);
  printf(" (y)\n");


  printf("U ");
  printBinary(uebertrag, 5);
  printf(" (Uebertrag)\n");


  printf("-------------------\n");


  printf("+ ");
  printBinary(summe, 5);
  printf(" (x + y)\n");


  return 0; 
}


ByKryptox973 
Fragesteller
 29.11.2023, 15:18

Mit deinem Code würde jetzt bei den Zahlen 7 und 12 der Übertrag : 00100 erscheinen. Bei z.B. 15 und 8 kommt dann 01000 obwohl es eigentlich 10000 sein müsste. Kann man dem irgendwie vorbeugen ? Ich wäre auch interessiert an deiner Lösung, wie du es umschreiben würdest, sofern du Zeit und Lust hast. Erstmal Danke für den Hinweis beim Übertrag

0
JulianOnFire  29.11.2023, 15:28
@ByKryptox973

Das war mein Fehler, ich habe nicht bedacht dass es natürlich auch außnahmen gibt. Wenn beide Zahlen gleich sind, ist der Übertrag 0. Das ist richtig, da in diesem Fall kein Übertrag von der rechten Stelle benötigt wird. Wenn beide Zahlen 1 sind, ist der Übertrag 1. Das ist natürlich falsch, da in diesem Fall ein Übertrag von der rechten Stelle benötigt wird. Also muss man den Abschnitt erweitern:

int uebertrag = ((a & b) | ((a ^ b) & (a ^ (a + b)))) | ((a == b) & ((a + b) == 15));

er rechnet den übertrag wie jetzt auch, nur prüft er jetzt, ob beide Zahlen gleich sind und ob die Summe 15 ist. Wenn ja, ist der Übertrag 1.

das sollte jetzt eigentlich so funktionieren, wenn nicht zeige ich dir wie ich es gemacht hätte.

#include <stdio.h>

void printBinary(int num, int bits) {

 for (int i = bits - 1; i >= 0; i--) {

  printf("%d", (num >> i) & 1);

 }

}

int main() {

 int a, b;

 printf("\n");

 printf("\n");

 printf(" Tippe deine erste Zahl zwischen 0 und 15 ein: ");

 scanf("%d", &a);

 if (a < 0 || a > 15) {

  printf("Error: Zahl liegt nicht zwischen 0 und 15\n");

  printf(" Programm beendet...\n");

  return 1; 

 }

 printf("Tippe deine zweite Zahl zwischen 0 und 15 ein ");

 scanf("%d", &b);

 if (b < 0 || b > 15) {

  printf("Error: Zahl liegt nicht zwischen 0 und 15\n");

  printf(" Programm beendet...\n");

  return 1; 

 }

 printf("\n");

 int summe = a + b;

 int uebertrag = ((a & b) | ((a ^ b) & (a ^ (a + b)))) | ((a == b) & ((a + b) == 15));

 printf(" ");

 printBinary(a, 5);

 printf(" (x)\n");

 printf("+ ");

 printBinary(b, 5);

 printf(" (y)\n");

 printf("U ");

 printBinary(uebertrag, 5);

 printf(" (Uebertrag)\n");

 printf("-------------------\n");

 printf("+ ");

 printBinary(summe, 5);

 printf(" (x + y)\n");

 return 0; 

}

0
ByKryptox973 
Fragesteller
 30.11.2023, 01:30
@JulianOnFire

Leider hat es immernoch nicht den richtigen übertrag angezeigt. Ich bin gespannt auf deine Lösung. Wie gesagt vorgabe war mit >>, << zu arbeiten. Angeblich wäre das die einfachste Lösung

0