<?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[Seltsames Verhalten von shift]]></title><description><![CDATA[<p>Hallo,<br />
das Problem ist ein wenig schwer zu beschreiben. Wenn ihr also mehr Kontext braucht, sagt Bescheid!<br />
Im Prinzip geht es um den shift operator. Vorab: ich benutze den Microsoft Visual C++ Express Compiler.<br />
Innerhalb eines komplexeren Algorithmus' liegt folgendes Stück Code vor</p>
<pre><code class="language-cpp">arr[x]&gt;&gt;(tmp-a);
</code></pre>
<ul>
<li>arr ist ein statisches array aus unsigned int's.</li>
<li>tmp ist eine static const variable vom typ unsigned int mit dem wert CHAR_BIT * sizeof(unsigned int) (in meinem Fall 32).</li>
<li>a ist vom typ unsigned int und ein Parameter der Funktion, also erst zur Compilezeit bekannt.</li>
</ul>
<p>Das Ergebnis des Algorithmus wird &quot;komisch&quot;, wenn a == 0 ist. In dem Falle würde der Wert an der Stelle x um 32 bit geshiftet, was ja bekanntlich undefiniert ist (weshalb ich diesen Fall jetzt extra behandele).<br />
Das Seltsame ist nun, dass bei diesem Code:</p>
<pre><code class="language-cpp">arr[x]&gt;&gt;(32);
</code></pre>
<p><div class="plugin-markdown"><input type="checkbox" id="checkbox128456" checked="true" /><label for="checkbox128456">nicht, während das untere seinen Wert auf 0 setzt (wie ich es ursprünglich beabsichtigt habe).</label></div><br />
Ich habe es bisher noch nicht geschafft, diesen &quot;Fehler&quot; zu reproduzieren. Er scheint nur in meinem Algorithmus aufzutreten.</p>
<p>Woran kann das liegen? Optimiert der Compiler im zweiten Fall den Ausdruck in arr[x]=0, was er im ersten Fall nicht kann und das Verhalten dort undefiniert bleibt?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/263450/seltsames-verhalten-von-shift</link><generator>RSS for Node</generator><lastBuildDate>Sat, 05 Sep 2026 18:24:01 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/263450.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 21 Mar 2010 05:42:20 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Seltsames Verhalten von shift on Sun, 21 Mar 2010 05:42:20 GMT]]></title><description><![CDATA[<p>Hallo,<br />
das Problem ist ein wenig schwer zu beschreiben. Wenn ihr also mehr Kontext braucht, sagt Bescheid!<br />
Im Prinzip geht es um den shift operator. Vorab: ich benutze den Microsoft Visual C++ Express Compiler.<br />
Innerhalb eines komplexeren Algorithmus' liegt folgendes Stück Code vor</p>
<pre><code class="language-cpp">arr[x]&gt;&gt;(tmp-a);
</code></pre>
<ul>
<li>arr ist ein statisches array aus unsigned int's.</li>
<li>tmp ist eine static const variable vom typ unsigned int mit dem wert CHAR_BIT * sizeof(unsigned int) (in meinem Fall 32).</li>
<li>a ist vom typ unsigned int und ein Parameter der Funktion, also erst zur Compilezeit bekannt.</li>
</ul>
<p>Das Ergebnis des Algorithmus wird &quot;komisch&quot;, wenn a == 0 ist. In dem Falle würde der Wert an der Stelle x um 32 bit geshiftet, was ja bekanntlich undefiniert ist (weshalb ich diesen Fall jetzt extra behandele).<br />
Das Seltsame ist nun, dass bei diesem Code:</p>
<pre><code class="language-cpp">arr[x]&gt;&gt;(32);
</code></pre>
<p><div class="plugin-markdown"><input type="checkbox" id="checkbox128456" checked="true" /><label for="checkbox128456">nicht, während das untere seinen Wert auf 0 setzt (wie ich es ursprünglich beabsichtigt habe).</label></div><br />
Ich habe es bisher noch nicht geschafft, diesen &quot;Fehler&quot; zu reproduzieren. Er scheint nur in meinem Algorithmus aufzutreten.</p>
<p>Woran kann das liegen? Optimiert der Compiler im zweiten Fall den Ausdruck in arr[x]=0, was er im ersten Fall nicht kann und das Verhalten dort undefiniert bleibt?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1871878</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1871878</guid><dc:creator><![CDATA[shifter]]></dc:creator><pubDate>Sun, 21 Mar 2010 05:42:20 GMT</pubDate></item><item><title><![CDATA[Reply to Seltsames Verhalten von shift on Sun, 21 Mar 2010 07:30:00 GMT]]></title><description><![CDATA[<p>Mehr Code. Hier ist ja noch nicht mal ne Zuweisung</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1871885</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1871885</guid><dc:creator><![CDATA[lll]]></dc:creator><pubDate>Sun, 21 Mar 2010 07:30:00 GMT</pubDate></item><item><title><![CDATA[Reply to Seltsames Verhalten von shift on Sun, 21 Mar 2010 08:20:00 GMT]]></title><description><![CDATA[<p>undefiniertes Verhalten bleibt undefiniertes Verhalten.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1871890</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1871890</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Sun, 21 Mar 2010 08:20:00 GMT</pubDate></item><item><title><![CDATA[Reply to Seltsames Verhalten von shift on Sun, 21 Mar 2010 10:52:58 GMT]]></title><description><![CDATA[<p>Warum ist das eigentlich undefiniert? Beim Shiften wird doch immer mit 0 aufgefüllt. Warum soll das für 32 oder 2000 nicht mehr gehen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1871933</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1871933</guid><dc:creator><![CDATA[??????????????]]></dc:creator><pubDate>Sun, 21 Mar 2010 10:52:58 GMT</pubDate></item><item><title><![CDATA[Reply to Seltsames Verhalten von shift on Sun, 21 Mar 2010 11:20:45 GMT]]></title><description><![CDATA[<p>?????????????? schrieb:</p>
<blockquote>
<p>Warum ist das eigentlich undefiniert? Beim Shiften wird doch immer mit 0 aufgefüllt. Warum soll das für 32 oder 2000 nicht mehr gehen?</p>
</blockquote>
<p>Weil ein bedeutender Prozessorbauer nur die niederwertigen fünf Bits des Schiebearguments überhaupt verdrahtet hatte, weshalb ein a&gt;&gt;b nur ein a&gt;&gt;(b%32) war.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1871947</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1871947</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Sun, 21 Mar 2010 11:20:45 GMT</pubDate></item><item><title><![CDATA[Reply to Seltsames Verhalten von shift on Sun, 21 Mar 2010 18:51:46 GMT]]></title><description><![CDATA[<p>Hier ein bisschen mehr Code (vereinfacht):</p>
<pre><code class="language-cpp">static const size_t BITS = CHAR_BIT*sizeof(size_t);

template&lt;size_t Bits&gt; // Bits ist immer &gt; BITS und ein Vielfaches von BITS
class Bitset
{
    size_t field[array_size];

   public: 
    static const size_t array_size = N/BITS;

    Bitset&amp; operator&lt;&lt;=(size_t a)
    {
        size_t tmp = a/BITS;

        /*
            Hier: Bits mittels memmove verschieben
        */

        a%=BITS; //Die &quot;übrigen&quot; Bits behandeln

        //if(a) return *this; // normalerweise diesen Fall abfangen
        for(size_t i(array_size-1);i!=tmp;--i)
             (field[i]&lt;&lt;=a)|=(field[i-1]&gt;&gt;(BITS-a));
        field[tmp]&lt;&lt;=a;

        return *this;
    }
};
</code></pre>
<p>Dieser Algorithmus funktioniert, wenn man die for Schleife nur ausführen lässt, wenn a != 0 ist (also a weder 0 noch ein Vielfaches von BITS ist).<br />
Wenn man das (wie oben) nicht macht, dann ergibt sich Folgendes:</p>
<pre><code class="language-cpp">int main()
{
   Bitset&lt;64&gt; obj; //obj initialisieren
   obj.print();
   obj&lt;&lt;=0;
   obj.print();
}
</code></pre>
<p>Output:</p>
<pre><code>10010010010010010010010010010010 01001001001001001001001001001001
10010010010010010010010010010010 [b]11011011011011011011011011011011[/b]
</code></pre>
<p>Wenn ich aber die Zeile 23 so ändere:</p>
<pre><code>(field[i]&lt;&lt;=a)|=(field[i-1]&gt;&gt;[b]32[/b]);
</code></pre>
<p>Dann sieht der Output wie folgt aus:</p>
<pre><code>10010010010010010010010010010010 01001001001001001001001001001001
10010010010010010010010010010010 [b]01001001001001001001001001001001[/b]
</code></pre>
<p>Bei mir ist CHAR_BIT == 8 und sizeof(size_t) == 4. Also ist BITS-a == 32, wenn a == 0 ist.<br />
Obwohl um den selben Wert geshiftet wird, bekomme ich ein anderes Ergebnis, wenn ich BITS-a mit 32 in dem Shift Algorithmus ersetze.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1872177</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1872177</guid><dc:creator><![CDATA[shifter]]></dc:creator><pubDate>Sun, 21 Mar 2010 18:51:46 GMT</pubDate></item><item><title><![CDATA[Reply to Seltsames Verhalten von shift on Sun, 21 Mar 2010 19:06:09 GMT]]></title><description><![CDATA[<p>(field[i]&lt;&lt;=a)|=...<br />
ist eh nicht definiert.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1872187</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1872187</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Sun, 21 Mar 2010 19:06:09 GMT</pubDate></item><item><title><![CDATA[Reply to Seltsames Verhalten von shift on Sun, 21 Mar 2010 19:07:14 GMT]]></title><description><![CDATA[<p>Zwinge ich den Compiler durch die Klammern nicht, field[i]&lt;&lt;=a zuerst auszuwerten?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1872188</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1872188</guid><dc:creator><![CDATA[shifter]]></dc:creator><pubDate>Sun, 21 Mar 2010 19:07:14 GMT</pubDate></item><item><title><![CDATA[Reply to Seltsames Verhalten von shift on Sun, 21 Mar 2010 19:26:30 GMT]]></title><description><![CDATA[<p>shifter schrieb:</p>
<blockquote>
<p>Zwinge ich den Compiler durch die Klammern nicht, field[i]&lt;&lt;=a zuerst auszuwerten?</p>
</blockquote>
<p>ja, das Auswerten, das Berechnen des Wertes, geschieht zuerst. Aber nicht die Wirkung der eingebauten Zuweisung. Die passiert irgendwann innerhalb des Gesamtausdrucks. Bei zwei Zuweisungen kann die Reihenfolge anders sein, als Du haben wolltest.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1872195</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1872195</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Sun, 21 Mar 2010 19:26:30 GMT</pubDate></item><item><title><![CDATA[Reply to Seltsames Verhalten von shift on Sun, 21 Mar 2010 19:35:26 GMT]]></title><description><![CDATA[<p>Du hattest recht volkard.<br />
Wenn ich das ganze so ändere</p>
<pre><code class="language-cpp">field[i]&lt;&lt;=a;
field[i]|=(field[i-1]&gt;&gt;(BITS-a));
</code></pre>
<p>dann ist es egal, ob BITS-a oder 32 da steht. Das Ergebns ist immer &quot;richtig&quot;.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1872199</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1872199</guid><dc:creator><![CDATA[shifter]]></dc:creator><pubDate>Sun, 21 Mar 2010 19:35:26 GMT</pubDate></item><item><title><![CDATA[Reply to Seltsames Verhalten von shift on Mon, 22 Mar 2010 06:16:06 GMT]]></title><description><![CDATA[<p>Trotzdem gilt</p>
<p>5.8 Shift operators schrieb:</p>
<blockquote>
<p>The behavior is undefined if the right operand is negative, or greater than or equal to the length in bits of the promoted left operand.</p>
</blockquote>
]]></description><link>https://www.c-plusplus.net/forum/post/1872311</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1872311</guid><dc:creator><![CDATA[Registrierter Troll]]></dc:creator><pubDate>Mon, 22 Mar 2010 06:16:06 GMT</pubDate></item></channel></rss>