<?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[Overflow Flag auslesen ohne inline asm]]></title><description><![CDATA[<p>Ich möchte gerne nach oder vor dem Addieren zweier vorzeichenloser build-in Ganzzahlen überprüfen, ob es einen Überlauf gab.<br />
Kann ich das OF direkt auslesen(sicher nicht) oder gibt es andere Mechanismen um das rauszufinden?</p>
<p>Ich möchte kein Assembler benutzen und auch nix a la</p>
<pre><code class="language-cpp">if(a + b &lt; a || a + b &lt; b)
  overflowstattgefunden();
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/topic/143777/overflow-flag-auslesen-ohne-inline-asm</link><generator>RSS for Node</generator><lastBuildDate>Wed, 02 Sep 2026 13:17:25 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/143777.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 11 Apr 2006 16:14:53 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Overflow Flag auslesen ohne inline asm on Tue, 11 Apr 2006 16:15:43 GMT]]></title><description><![CDATA[<p>Ich möchte gerne nach oder vor dem Addieren zweier vorzeichenloser build-in Ganzzahlen überprüfen, ob es einen Überlauf gab.<br />
Kann ich das OF direkt auslesen(sicher nicht) oder gibt es andere Mechanismen um das rauszufinden?</p>
<p>Ich möchte kein Assembler benutzen und auch nix a la</p>
<pre><code class="language-cpp">if(a + b &lt; a || a + b &lt; b)
  overflowstattgefunden();
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1035391</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1035391</guid><dc:creator><![CDATA[nirsaja]]></dc:creator><pubDate>Tue, 11 Apr 2006 16:15:43 GMT</pubDate></item><item><title><![CDATA[Reply to Overflow Flag auslesen ohne inline asm on Tue, 11 Apr 2006 16:38:26 GMT]]></title><description><![CDATA[<p>Es gibt keine Möglichkeit, einen Überlauf abzufangen: Überläufe erzeugen nicht definiertes Verhalten. In der MSDN gibt es <a href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dncode/html/secure01142004.asp" rel="nofollow">hier</a> einen Artikel der beschreibt, wie man mit dem Problem umgehen kann.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1035402</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1035402</guid><dc:creator><![CDATA[Gideon]]></dc:creator><pubDate>Tue, 11 Apr 2006 16:38:26 GMT</pubDate></item><item><title><![CDATA[Reply to Overflow Flag auslesen ohne inline asm on Tue, 11 Apr 2006 16:39:03 GMT]]></title><description><![CDATA[<p>Und es gibt auch keinen Handler, äquivalent zu _matherr???</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1035404</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1035404</guid><dc:creator><![CDATA[nirsaja]]></dc:creator><pubDate>Tue, 11 Apr 2006 16:39:03 GMT</pubDate></item><item><title><![CDATA[Reply to Overflow Flag auslesen ohne inline asm on Tue, 11 Apr 2006 17:09:32 GMT]]></title><description><![CDATA[<p>Na gut... machen wir's eben doch dirty:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;

using namespace std;

template &lt;typename T&gt; bool isof(T x, T y);

int main(void)
{
  unsigned short int x = 0xFFFA;
  unsigned short int y = 0xC0DE;

  cout &lt;&lt; isof(x,y);

  cin.get();
  return 0;
}

template &lt;typename T&gt; bool isof(T x, T y)
{
  T ergebnis = x + y;
  return ( ergebnis &lt; x || ergebnis &lt; y);
}
</code></pre>
<p>Daraus bastelt mein Compiler</p>
<pre><code>add ax, [ebp+0x0c]
</code></pre>
<p>Meiner Meinung nach landet hier das Ergebnis wieder im Akkumulator. Dort wäre das doch kein &quot;undefiniertes Verhalten&quot;?!?! Das MSB wird abgeschnitten, bzw gar nicht erst berechnet, sprich ich verliere ein Bit und fetig.<br />
Das Ergebnis ist im Falle eines Überlaufs dann nicht mehr größer als Operand1 und Operand2!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1035421</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1035421</guid><dc:creator><![CDATA[nirsaja]]></dc:creator><pubDate>Tue, 11 Apr 2006 17:09:32 GMT</pubDate></item><item><title><![CDATA[Reply to Overflow Flag auslesen ohne inline asm on Tue, 11 Apr 2006 20:30:07 GMT]]></title><description><![CDATA[<p>Du hast Recht, &quot;undefiniertes Verhalten&quot; bedeutet im C/C++-Kontext etwas wie</p>
<pre><code class="language-cpp">int *p = new int; 
*(p - 73) = 15;
</code></pre>
<p>Was ich eigentlich sagen wollte ist, dass der C++ Standard nicht vorschreibt was passiert, wenn ein Integer nicht mehr dargestellt werden kann. Diese Dinge regelt der Compiler, in deinem Fall via Akkumulator. Auf einer nicht x86 Architektur gibt es aber möglicherweise keinen Akkumulator, darum kann der Standard auch nichts derartiges vorschreiben.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1035528</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1035528</guid><dc:creator><![CDATA[Gideon]]></dc:creator><pubDate>Tue, 11 Apr 2006 20:30:07 GMT</pubDate></item><item><title><![CDATA[Reply to Overflow Flag auslesen ohne inline asm on Wed, 12 Apr 2006 13:36:47 GMT]]></title><description><![CDATA[<p>&quot;undefiniertes verhalten&quot; ist genau das: der C++ standard verlangt kein bestimmtes verhalten für ein programm, das ein solches konstrukt enthält. das heißt aber insbesondere auch, dass eine implementation tatsächlich ein ganz bestimmtes verhalten dafür definieren darf (nur ist das ganze dann eben nicht portabel). gerade für überläufe in arithmetischen ausdrücken wird dies für gewöhnlich geschehen - und wird durch die zugrunde liegende architektur bestimmt sein. für alles PC artige (sagen wir x86, ppc etc.) heißt das eben, das solche ausdrücke modulo 2^n (evtl. per 2erkomplement) berechnet werden, entsprechend des typs des ausdrucks. mit akkumulatoren u.ä. hat das vordergründig aber nichts zu tun.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1035984</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1035984</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Wed, 12 Apr 2006 13:36:47 GMT</pubDate></item><item><title><![CDATA[Reply to Overflow Flag auslesen ohne inline asm on Thu, 13 Apr 2006 14:08:53 GMT]]></title><description><![CDATA[<p>Mir geht es darum, dass der Überlauf &quot;in der CPU&quot; stattfindet - nicht im Speicher. Hier geht es ja um etwas anderes als das Schreiben auf nicht allokiertem Speicher, sprich Zugriffsverletzungen, wo das OS seine Pfoten im Spiel hat.<br />
Der Prozesser wird wohl kaum an einer Stelle des Registers schreiben wo physikalisch gar nix mehr ist. Außerdem wäre es doch katastrophal, wenn ein einfacher Aufruf von ADD Reg16 Mem16 mit 0xFFFF 0xFFFF den Prozessor aus dem Takt bringen würde.</p>
<p>PS: Mit dem Standard hat das meiner Meinung nach nichts zu tun. Klar ist, dass er hierfür nichts vorgeben kann. Aber ob ich so eine Operation nun in C++ programmiere, oder direkt in Assembler codiere ist ein und dasselbe.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1036854</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1036854</guid><dc:creator><![CDATA[nirsaja]]></dc:creator><pubDate>Thu, 13 Apr 2006 14:08:53 GMT</pubDate></item></channel></rss>