<?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 bei Integeraddition]]></title><description><![CDATA[<p>Hallo, gibt es irgend eine Möglichkeit festzustellen, ob bei der Addition zweier unsigned integers ein Overflow aufgetreten ist?<br />
Der Einzige Ansatz, der Mir einfallen würe, wäre:</p>
<pre><code class="language-cpp">bool overflow(unsigned int a, unsigned int b)
{
    unsigned int tmp = a;
    tmp+=b;

    if(a&gt;tmp || b&gt;tmp)
        return true;
    return false;
}
</code></pre>
<p>Geht das nicht irgendwie eleganter?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/256913/overflow-bei-integeraddition</link><generator>RSS for Node</generator><lastBuildDate>Wed, 09 Sep 2026 13:31:24 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/256913.rss" rel="self" type="application/rss+xml"/><pubDate>Sat, 19 Dec 2009 18:02:20 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Overflow bei Integeraddition on Sat, 19 Dec 2009 18:02:20 GMT]]></title><description><![CDATA[<p>Hallo, gibt es irgend eine Möglichkeit festzustellen, ob bei der Addition zweier unsigned integers ein Overflow aufgetreten ist?<br />
Der Einzige Ansatz, der Mir einfallen würe, wäre:</p>
<pre><code class="language-cpp">bool overflow(unsigned int a, unsigned int b)
{
    unsigned int tmp = a;
    tmp+=b;

    if(a&gt;tmp || b&gt;tmp)
        return true;
    return false;
}
</code></pre>
<p>Geht das nicht irgendwie eleganter?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1825057</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1825057</guid><dc:creator><![CDATA[Olrig]]></dc:creator><pubDate>Sat, 19 Dec 2009 18:02:20 GMT</pubDate></item><item><title><![CDATA[Reply to Overflow bei Integeraddition on Sat, 19 Dec 2009 18:13:57 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;climits&gt;
using namespace std;

bool uintAddOverflowTest(unsigned int left, unsigned int right)
{
    return (UINT_MAX - left) &lt; right;
}

int main()
{
    cout &lt;&lt; uintAddOverflowTest(4294967290, 123) &lt;&lt; endl;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1825061</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1825061</guid><dc:creator><![CDATA[Schalsritter]]></dc:creator><pubDate>Sat, 19 Dec 2009 18:13:57 GMT</pubDate></item><item><title><![CDATA[Reply to Overflow bei Integeraddition on Tue, 05 Jan 2010 00:16:25 GMT]]></title><description><![CDATA[<p>Gibt es irgendeinen Grund, nicht folgendes zu machen:</p>
<pre><code class="language-cpp">bool add_a(uint&amp; a, const uint&amp; b)
{
   a+=b;
   return a&lt;b;
}
</code></pre>
<p>Sollte das nicht deutlich performanter und portabler sein, als die hier vorgeschlagene Methode?</p>
<pre><code class="language-cpp">bool add_b(uint&amp; a, const uint&amp; b)
{
   bool uebertrag = (UINT_MAX - a) &lt; b;
   a+=b;
   return uebertrag;
}
</code></pre>
<p>Oder gibt es Fälle, in denen add_a falsch ist?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1832631</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1832631</guid><dc:creator><![CDATA[Olrig]]></dc:creator><pubDate>Tue, 05 Jan 2010 00:16:25 GMT</pubDate></item><item><title><![CDATA[Reply to Overflow bei Integeraddition on Tue, 05 Jan 2010 21:31:21 GMT]]></title><description><![CDATA[<p>Olrig schrieb:</p>
<blockquote>
<p>Gibt es irgendeinen Grund, nicht folgendes zu machen:</p>
<pre><code class="language-cpp">bool add_a(uint&amp; a, const uint&amp; b)
{
   a+=b;
   return a&lt;b;
}
</code></pre>
<p>Sollte das nicht deutlich performanter und portabler sein, als die hier vorgeschlagene Methode?</p>
</blockquote>
<p>performanter vielleicht, portabler sicher nicht. Meines Wissens ist gar nicht definiert, was bei a herauskommt, wenn ein overflow auftritt. Portabel wäre es sicher dann, wenn man std::numeric_limits&lt; uint &gt;::max() als Maximalwert verwendet.</p>
<p>Im Übrigen würde ich eine eigene Klasse für diese unsigned int mit Überlaufkontrolle und Exception vorschlagen. Das sähe ungefähr so aus:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;stdexcept&gt;
#include &lt;limits&gt;

namespace detail
{
    void checkOverflowOnPlus( unsigned int a, unsigned int b )
    {
        if( a &gt; std::numeric_limits&lt; unsigned int &gt;::max() - b )
            throw std::overflow_error( &quot;Addition zweier unsigned int überschreitet das Limit&quot; );
    }
}

class UInt
{
public:
    UInt( unsigned int x = 0 ) : m_x( x ) {}
    UInt&amp; operator+=( const UInt&amp; b )
    {
        return add( b.m_x );
    }
    UInt&amp; operator+=( unsigned int b )
    {
        return add( b );
    }
    friend std::ostream&amp; operator&lt;&lt;( std::ostream&amp; out, const UInt&amp; i )
    {
        return out &lt;&lt; i.m_x;
    }
private:
    UInt&amp; add( unsigned int b )
    {
        detail::checkOverflowOnPlus( m_x, b );
        m_x += b;
        return *this;
    }
    unsigned int m_x;
};

UInt operator+( UInt a, const UInt&amp; b )
{
    return a += b;
}
UInt operator+( UInt a, unsigned int b )
{
    return a += b;
}
UInt operator+( unsigned int a, UInt b )
{
    return b += a;
}

int main()
{
    using namespace std;
    UInt a1 = 2314;
    cout &lt;&lt; (123456u + a1) &lt;&lt; endl;
    return 0;
}
</code></pre>
<p>Der Vorteil ist, dass man damit genauso Code schreiben kann, wie mit normalen unsigned int. Über ein typedef kann dann schnell mal umschalten.<br />
.. könnte man auch noch sehr schön 'templatisieren' - boost lässt grüßen.</p>
<p>Gruß<br />
Werner</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1833313</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1833313</guid><dc:creator><![CDATA[Werner Salomon]]></dc:creator><pubDate>Tue, 05 Jan 2010 21:31:21 GMT</pubDate></item><item><title><![CDATA[Reply to Overflow bei Integeraddition on Tue, 05 Jan 2010 22:44:53 GMT]]></title><description><![CDATA[<p>Werner Salomon schrieb:</p>
<blockquote>
<p>Meines Wissens ist gar nicht definiert, was bei a herauskommt, wenn ein overflow auftritt</p>
</blockquote>
<p>Ist das nich durch den Standard gesichert? Nämlich immer die Zahl modulo Max_int (zumindest bei unsigned integers).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1833370</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1833370</guid><dc:creator><![CDATA[Olrig]]></dc:creator><pubDate>Tue, 05 Jan 2010 22:44:53 GMT</pubDate></item><item><title><![CDATA[Reply to Overflow bei Integeraddition on Tue, 05 Jan 2010 22:54:45 GMT]]></title><description><![CDATA[<p>Olrig schrieb:</p>
<blockquote>
<p>Werner Salomon schrieb:</p>
<blockquote>
<p>Meines Wissens ist gar nicht definiert, was bei a herauskommt, wenn ein overflow auftritt</p>
</blockquote>
<p>Ist das nich durch den Standard gesichert? Nämlich immer die Zahl modulo Max_int (zumindest bei unsigned integers).</p>
</blockquote>
<p>Für unsigned Typen ist es gesichert, für andere ist das Ergebnis undefiniert (allerdings ist das Zweierkomplement die vorherrschende Art der Darstellung negativer Zahlen, so dass bei Überlauf von signed Typen auf fast jedem System das herauskommt, was man beim Zweierkomplement erwartet).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1833372</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1833372</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Tue, 05 Jan 2010 22:54:45 GMT</pubDate></item><item><title><![CDATA[Reply to Overflow bei Integeraddition on Tue, 05 Jan 2010 23:25:43 GMT]]></title><description><![CDATA[<p>Mal eine etwas andere frage: Ich habe diesen Algorithmus zum bitweisen addieren von unsigned intergers gefunden:</p>
<pre><code class="language-cpp">unsigned int add(unsigned int a, unsigned int b)
{
    unsigned int sum   = a ^ b;
    unsigned int carry = a &amp; b;

    while(carry)
    {
        carry&lt;&lt;=1;
        a = sum;
        sum = a ^ carry;
        carry = a &amp; carry;
    }
    return sum;
}
</code></pre>
<p>Der Algorithmus funktioniert auch einwandfrei. Aber kann ich irgendwie auf der &quot;Bitebene&quot; oder im Verlauf des Algorithmus ablesen, ob bei ein Overflow aufgetreten ist?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1833381</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1833381</guid><dc:creator><![CDATA[Olrig]]></dc:creator><pubDate>Tue, 05 Jan 2010 23:25:43 GMT</pubDate></item><item><title><![CDATA[Reply to Overflow bei Integeraddition on Wed, 06 Jan 2010 00:43:25 GMT]]></title><description><![CDATA[<p>Werner Salomon schrieb:</p>
<blockquote>
<p>...</p>
</blockquote>
<p>Werner Salomon zeigt wie immer eine gute Lösung <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f44d.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--thumbs_up"
      title=":+1:"
      alt="👍"
    /> .<br />
@Olrig, eig. solltest du das von Werner Salomon übernehmen können und einfach die anderen Operatoren überladen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1833398</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1833398</guid><dc:creator><![CDATA[freaky]]></dc:creator><pubDate>Wed, 06 Jan 2010 00:43:25 GMT</pubDate></item><item><title><![CDATA[Reply to Overflow bei Integeraddition on Wed, 06 Jan 2010 05:47:53 GMT]]></title><description><![CDATA[<p>Olrig schrieb:</p>
<blockquote>
<p>Aber kann ich irgendwie auf der &quot;Bitebene&quot; oder im Verlauf des Algorithmus ablesen, ob bei ein Overflow aufgetreten ist?</p>
</blockquote>
<p>Dann, wenn carry&lt;&lt;=1 das Ergebnis 0 liefert.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1833424</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1833424</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Wed, 06 Jan 2010 05:47:53 GMT</pubDate></item><item><title><![CDATA[Reply to Overflow bei Integeraddition on Wed, 06 Jan 2010 15:25:46 GMT]]></title><description><![CDATA[<p>[quote=&quot;Olrig&quot;]Gibt es irgendeinen Grund, nicht folgendes zu machen:</p>
<pre><code class="language-cpp">bool add_a(uint&amp; a, const uint&amp; b)
{
   a+=b;
   return a&lt;b;
}
</code></pre>
<p>Sollte das nicht deutlich performanter und portabler sein, als die hier vorgeschlagene Methode?</p>
<p><img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f44d.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--thumbs_up"
      title=":+1:"
      alt="👍"
    /></p>
<p>Olrig schrieb:</p>
<blockquote>
<p>...<br />
Oder gibt es Fälle, in denen add_a falsch ist?</p>
</blockquote>
<p>Solche Fälle gibt es nicht!</p>
<p><strong>a &lt; b ? (0x100000000+a) : a</strong></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1833756</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1833756</guid><dc:creator><![CDATA[balduin]]></dc:creator><pubDate>Wed, 06 Jan 2010 15:25:46 GMT</pubDate></item><item><title><![CDATA[Reply to Overflow bei Integeraddition on Wed, 06 Jan 2010 18:09:14 GMT]]></title><description><![CDATA[<p>Für den unsigned - Fall nehme ich normalerweise<br />
const bool isOverflowed = a + b &lt; a;</p>
<p>Für den Allgemeinfall dann doch lieber den SafeInt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1833851</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1833851</guid><dc:creator><![CDATA[Superlexx]]></dc:creator><pubDate>Wed, 06 Jan 2010 18:09:14 GMT</pubDate></item><item><title><![CDATA[Reply to Overflow bei Integeraddition on Thu, 07 Jan 2010 00:20:24 GMT]]></title><description><![CDATA[<p>camper schrieb:</p>
<blockquote>
<p>Olrig schrieb:</p>
<blockquote>
<p>Aber kann ich irgendwie auf der &quot;Bitebene&quot; oder im Verlauf des Algorithmus ablesen, ob bei ein Overflow aufgetreten ist?</p>
</blockquote>
<p>Dann, wenn carry&lt;&lt;=1 das Ergebnis 0 liefert.</p>
</blockquote>
<p>Aber die Funktion wir ja erst verlassen, WENN carry == 0 ist. Das heißt ich müsste VOR dem letzten Schleifendurchlauf testen, ob das höchstwertigste Bit in carry gesetzt ist?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1834048</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1834048</guid><dc:creator><![CDATA[Olrig]]></dc:creator><pubDate>Thu, 07 Jan 2010 00:20:24 GMT</pubDate></item></channel></rss>