<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Probleme mit Übertrag bei Addition...]]></title><description><![CDATA[<p>Moin,</p>
<p>sitze gerade über ´nem Problem, dass ich einfach nicht gelöst bekommen...<br />
Wir haben von unserem Prof die Aufgabe, eine Klasse für beliebig lange Zaheln zu schreiben.... Das klappt bisher auch ganz gut wenns ums kopieren, speichern und lesen geht. Das Problem liegt jetzt bei den mathematischen Funktionen.<br />
Ich will jetzt zwei Zahlen addieren. Die sind noch relativ klein gehalten um das ganze überschaubar zu halten. Beim addieren habe ich nun folgenden Teilcode:</p>
<pre><code>buffer.Segment[0].low  = 0;
	buffer.Segment[0].high = 0;

	for(int i = 0; i &lt; ergSize; i++){		
		buffer.Segment[0].high   = buffer.Segment[0].low; // Übertrag holen
		buffer.Segment[0].low    = 0; // Speicher für Übertrag zurück setzen
		buffer.Segment[0].high  = buffer.Segment[0].high + _Digits[ergSize-1-i] + n2._Digits[ergSize-1-i]; // Übertrag + Zahl1 + Zahl2
		erg._Digits[ergSize-i-1] = buffer.Segment[0].high; // Ergebnis schreiben
	}

	if(buffer.Segment[0].low != 0){
                // Falls ein Übertrag ganz vorne steht,
                // wird das Ergebnis um ein Byte verlängert und alles
                // um ein Byte nach rechts geschoben. Übertrag schreiben.
		erg.setSize(ergSize+1);
		erg._Digits[0] = buffer.Segment[0].low;
	}
</code></pre>
<p>Dabei ist buffer ein union (Vorgabe), erg ist ein Objekt in dem das Ergebnis gespeichert werden soll und _Digits ist ein Pointer auf den Anfang der zu speichernden Zahl. Im Prinzip werden immer zwei Zahlen inkl. Übertrag der letzten Rechnung addiert, wobei der evtl. Übertrag ein Byte weiter vorne im union gespeichert wird. Das union besteht (einfach gesagt) aus 4 unsigned chars (= 4 bytes). Ich benutze aber nur zwei Bytes, wobei auf dem letzten Byte die Berechnungen laufen und Überträge generell auf dem davor landen.<br />
Das funktioniert so auch wunderbar, bis auf den Übertrag nach jedem zweiten Byte!!! Unser Prof erwähnte da mal, dass es da Prozessorintern unterschiede gibt - so wegen BigEndian und LittleEndian. (Ich hab `n Intel...)<br />
Die Ergebnisse und auch die einzelnen Zahlen lasse ich mir Hexadezimal ausgeben.<br />
Als Beispiel:<br />
75BCD15<br />
+ 1E240<br />
=75DAF55<br />
Das wäre richtig, aber nach dem zweiten Byte macht meine Rechnung da Probleme und gibt als Ergebnis 75<em>C</em>AF15 aus.....</p>
<p>Hat da jemand ´ne Lösung für?<br />
Schonmal Danke, woll?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/198747/probleme-mit-übertrag-bei-addition</link><generator>RSS for Node</generator><lastBuildDate>Fri, 02 Oct 2026 14:55:57 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/198747.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 25 Nov 2007 00:07:54 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Probleme mit Übertrag bei Addition... on Sun, 25 Nov 2007 00:07:54 GMT]]></title><description><![CDATA[<p>Moin,</p>
<p>sitze gerade über ´nem Problem, dass ich einfach nicht gelöst bekommen...<br />
Wir haben von unserem Prof die Aufgabe, eine Klasse für beliebig lange Zaheln zu schreiben.... Das klappt bisher auch ganz gut wenns ums kopieren, speichern und lesen geht. Das Problem liegt jetzt bei den mathematischen Funktionen.<br />
Ich will jetzt zwei Zahlen addieren. Die sind noch relativ klein gehalten um das ganze überschaubar zu halten. Beim addieren habe ich nun folgenden Teilcode:</p>
<pre><code>buffer.Segment[0].low  = 0;
	buffer.Segment[0].high = 0;

	for(int i = 0; i &lt; ergSize; i++){		
		buffer.Segment[0].high   = buffer.Segment[0].low; // Übertrag holen
		buffer.Segment[0].low    = 0; // Speicher für Übertrag zurück setzen
		buffer.Segment[0].high  = buffer.Segment[0].high + _Digits[ergSize-1-i] + n2._Digits[ergSize-1-i]; // Übertrag + Zahl1 + Zahl2
		erg._Digits[ergSize-i-1] = buffer.Segment[0].high; // Ergebnis schreiben
	}

	if(buffer.Segment[0].low != 0){
                // Falls ein Übertrag ganz vorne steht,
                // wird das Ergebnis um ein Byte verlängert und alles
                // um ein Byte nach rechts geschoben. Übertrag schreiben.
		erg.setSize(ergSize+1);
		erg._Digits[0] = buffer.Segment[0].low;
	}
</code></pre>
<p>Dabei ist buffer ein union (Vorgabe), erg ist ein Objekt in dem das Ergebnis gespeichert werden soll und _Digits ist ein Pointer auf den Anfang der zu speichernden Zahl. Im Prinzip werden immer zwei Zahlen inkl. Übertrag der letzten Rechnung addiert, wobei der evtl. Übertrag ein Byte weiter vorne im union gespeichert wird. Das union besteht (einfach gesagt) aus 4 unsigned chars (= 4 bytes). Ich benutze aber nur zwei Bytes, wobei auf dem letzten Byte die Berechnungen laufen und Überträge generell auf dem davor landen.<br />
Das funktioniert so auch wunderbar, bis auf den Übertrag nach jedem zweiten Byte!!! Unser Prof erwähnte da mal, dass es da Prozessorintern unterschiede gibt - so wegen BigEndian und LittleEndian. (Ich hab `n Intel...)<br />
Die Ergebnisse und auch die einzelnen Zahlen lasse ich mir Hexadezimal ausgeben.<br />
Als Beispiel:<br />
75BCD15<br />
+ 1E240<br />
=75DAF55<br />
Das wäre richtig, aber nach dem zweiten Byte macht meine Rechnung da Probleme und gibt als Ergebnis 75<em>C</em>AF15 aus.....</p>
<p>Hat da jemand ´ne Lösung für?<br />
Schonmal Danke, woll?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1409630</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1409630</guid><dc:creator><![CDATA[LeoB.]]></dc:creator><pubDate>Sun, 25 Nov 2007 00:07:54 GMT</pubDate></item></channel></rss>