Übungsblatt 2 - Fragen zur Aufgabe 2.4 EvenLonger

Disclaimer: Dieser Thread wurde aus dem alten Forum importiert. Daher werden eventuell nicht alle Formatierungen richtig angezeigt. Der ursprüngliche Thread beginnt im zweiten Post dieses Threads.

Übungsblatt 2 - Fragen zur Aufgabe 2.4 EvenLonger
Hallo zusammen,

ich habe eine Frage zur Aufgabe 2.4 b) vom Übungsblatt 2.
Hier wird davon ausgegangen, dass eine positive Zahl z folgendermaßen dargestellt wird:
z = a[3] * (2^31)^3 + a[2] * (2^31)^2 + a[1] * 2^31 + a[0].
Weiterhin gilt: Negative Zahlen werden durch das 2er-Komplement dargestellt. Wobei das 2^30-Bit von a[3] das
Vorzeichenbit ist.

In Teilaufgabe b) soll man nun folgendes machen:
Im Array a ist eine EvenLonger-Zahl gespeichert. Sie sollen die Zahl -a im 2er-
Komplement berechnen und wieder in a als EvenLonger-Zahl speichern.

Als Testfall ist nun angegeben:

reset(a, b);

// Test “calc negative of 1”
ok = true;
a[0] = 1;
negative(a);
i = 0;
while (i < 4) {
if (a[ i ] != 0x7FFFFFFF) {
ok = false;
}
++i;
}
if (ok) {
System.out.println(“Berechnung von negative(1): OK”);
} else {
System.out.println(“Berechnung vom negative(1): Fehler”);
}

Jetzt stellt sich mir die Frage, ob diese Testfall so wirklich stimmig ist. Denn der Wert 1 wird ja nur in a[0] eingetragen.
Das heißt die Zahl als ganzes ist “nur” 1.
In der while-Schleife wird aber a[0]-a[3] auf Ungleichheit mit 0x7FFFFFFF geprügt.
Ist dies einmal der Fall, so wird angezeigt, dass die Methode nicht korrekt arbeitet.

Muss a[1]-a[3] denn überhaupt verändert werden, wenn eh “0” drinnen steht?
Ich glaube, ich stehe auf dem Schlauch…

Des Weiteren ist mir nicht ganz ersichtlich, was mit “Wobei das 2^30-Bit von a[3] das Vorzeichenbit ist.” gemeint ist.
Kann mir jemand Tipps geben?

Vielen Dank! :slight_smile:


1 ist im Prinzip 0*(2^31)^3+0*(2^31)^2+0*(2^31)^1+1*(2^31)^0. Man hat also die Zahl 0…01 mit leicht mehr als 120 Nullern.

Das Zweierkomplement (ZK) einer Zahl besteht aus der “Umdrehung” aller Bits (also 0 wird zu 1 und 1 zu 0) => die Zahl wird zu 1111111…1111110 (mit etwas mehr als 120 Einsern) oder im Hexadezimalsystem 0x7FFFFFFF 0x7FFFFFFF 0x7FFFFFFF 0x7FFFFFFE.
Außerdem besteht das ZK aus einer anschließenden Addition von 1 => die Zahl wird zu 0x7FFFFFFF 0x7FFFFFFF 0x7FFFFFFF 0x7FFFFFFF.

Somit muss der Testfall korrekt durchlaufen. Oder?

Das Vorzeichenbit ist im Allgemeinen die Ziffer in der Zahl, die zeigt, ob die Zahl größer, gleich oder kleiner als 0 ist. Meist verwendet man dafür das 1. Bit von links (in dieser Aufgabe das 2.) und bezeichnet die Zahlen mit führender “0” als nicht negativ und die mit führender “1” als negativ.


Aber bitte daran denken, dass bei dieser Aufgabe das 2^30-Bit verwendet wird, also das zweite von links. Ansonsten war alles korrekt erklärt. :wink:


Vielen Dank für die Hilfe! :slight_smile:

Da hatte ich wohl ein Brett vor dem Kopf. Und siehe da: jetzt werden alle Testfälle erfolgreich durchlaufen.


Hallo zusammen,
ich bin nun auch endlich so weit, dass die Testfälle bei mir richtig angezeigt werden, wollte nun aber noch ein paar eigene Tests machen, speziell Extrem-/Grenzwerte. Ich wollte fragen, ob ich die “echten” zahlen richtig auf den int-Array abbilde.
Z.B. habe ich fürs Addieren als a die Zahl 0x40000000 (also die Zahl, bei der ein Element überläuft) und als b die Zahl 0xBEEF (mir ist nix blöderes eingefallen.). Der Array a setzt sich bei mir so zusammen: a[0] = 0; a[1] = 1; a[2] = 0; a[3] = 0, b so: b[0] = 0xBEEF, rest null. Es wird nun auch korrekt addiert und das Ergebnis in erwarteter Form in c gelegt. Ist meine Aufteilung so korrekt?
Danke schonmal :slight_smile:
Edit: noch eine Frage: Muss man damit rechnen, dass die Parameter für add und sub negativ sind?


Ja.


Hat ihnen auch schon jemand erzählt, dass das beim Zweierkomplement relativ egal ist (wenn man es richtig macht)?


Ist mir nach etwas nachdenken auch eingefallen. Sorry!