<?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[Problem mit enum und unsigned]]></title><description><![CDATA[<pre><code>typedef enum {leer = 0,
			weisserBauer = 1, weisserTurm = 2, weisserSpringer = 3, weisserLaeufer = 4, weisseDame = 5, weisserKoenig = 6,
			schwarzerBauer = 7, schwarzerTurm = 8, schwarzerSpringer = 9, schwarzerLaeufer = 10, schwarzeDame = 11, schwarzerKoenig = 12
} Figur; // 12 Figuren brauchen 4 Bit: 2^4 = 16

ostream&amp; operator&lt;&lt;(ostream&amp; out, Figur figur)
{
	switch (figur)
	{
	case weisserBauer: out &lt;&lt; &quot;wB&quot;; break;
	case weisserTurm: out &lt;&lt; &quot;wT&quot;; break;
	case weisserSpringer: out &lt;&lt; &quot;wS&quot;; break;
	case weisserLaeufer: out &lt;&lt; &quot;wL&quot;; break;
	case weisseDame: out &lt;&lt; &quot;wD&quot;; break;
	case weisserKoenig: out &lt;&lt; &quot;wK&quot;; break;

	case schwarzerBauer: out &lt;&lt; &quot;sB&quot;; break;
	case schwarzerTurm: out &lt;&lt; &quot;sT&quot;; break;
	case schwarzerSpringer: out &lt;&lt; &quot;sS&quot;; break;
	case schwarzerLaeufer: out &lt;&lt; &quot;sL&quot;; break;
	case schwarzeDame: out &lt;&lt; &quot;sD&quot;; break;
	case schwarzerKoenig: out &lt;&lt; &quot;sK&quot;; break;
	}
	return out;
}

struct Zug
{
	unsigned weisserSpielerAmZug : 1;
	unsigned von : 6; // 2^6 = 64 Felder
	unsigned zu : 6; // 2^6 = 64 Felder
	Figur ziehendeFigur : 4;
	Figur geschlageneFigur : 4;
};
</code></pre>
<p>Wenn ich jetzt einen Zug zug{1, 0, 1, schwarzerSpringer, leer}; erstelle und<br />
ostream&amp; operator&lt;&lt;(ostream&amp; out, Figur figur) mit figur == zug; aufrufe, hat er im Debugger den Wert &quot;-7&quot; (obwohl da unsigned steht) und das switch im operator&lt;&lt; wird übersprungen. Wenn ich im operator&lt;&lt; &quot;switch ((unsigned)figur)&quot; schreibe, hilft das nichts.</p>
<p>Wer kann mir helfen?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/323366/problem-mit-enum-und-unsigned</link><generator>RSS for Node</generator><lastBuildDate>Thu, 16 Jul 2026 04:45:30 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/323366.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 27 Jan 2014 17:51:36 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Problem mit enum und unsigned on Mon, 27 Jan 2014 17:51:36 GMT]]></title><description><![CDATA[<pre><code>typedef enum {leer = 0,
			weisserBauer = 1, weisserTurm = 2, weisserSpringer = 3, weisserLaeufer = 4, weisseDame = 5, weisserKoenig = 6,
			schwarzerBauer = 7, schwarzerTurm = 8, schwarzerSpringer = 9, schwarzerLaeufer = 10, schwarzeDame = 11, schwarzerKoenig = 12
} Figur; // 12 Figuren brauchen 4 Bit: 2^4 = 16

ostream&amp; operator&lt;&lt;(ostream&amp; out, Figur figur)
{
	switch (figur)
	{
	case weisserBauer: out &lt;&lt; &quot;wB&quot;; break;
	case weisserTurm: out &lt;&lt; &quot;wT&quot;; break;
	case weisserSpringer: out &lt;&lt; &quot;wS&quot;; break;
	case weisserLaeufer: out &lt;&lt; &quot;wL&quot;; break;
	case weisseDame: out &lt;&lt; &quot;wD&quot;; break;
	case weisserKoenig: out &lt;&lt; &quot;wK&quot;; break;

	case schwarzerBauer: out &lt;&lt; &quot;sB&quot;; break;
	case schwarzerTurm: out &lt;&lt; &quot;sT&quot;; break;
	case schwarzerSpringer: out &lt;&lt; &quot;sS&quot;; break;
	case schwarzerLaeufer: out &lt;&lt; &quot;sL&quot;; break;
	case schwarzeDame: out &lt;&lt; &quot;sD&quot;; break;
	case schwarzerKoenig: out &lt;&lt; &quot;sK&quot;; break;
	}
	return out;
}

struct Zug
{
	unsigned weisserSpielerAmZug : 1;
	unsigned von : 6; // 2^6 = 64 Felder
	unsigned zu : 6; // 2^6 = 64 Felder
	Figur ziehendeFigur : 4;
	Figur geschlageneFigur : 4;
};
</code></pre>
<p>Wenn ich jetzt einen Zug zug{1, 0, 1, schwarzerSpringer, leer}; erstelle und<br />
ostream&amp; operator&lt;&lt;(ostream&amp; out, Figur figur) mit figur == zug; aufrufe, hat er im Debugger den Wert &quot;-7&quot; (obwohl da unsigned steht) und das switch im operator&lt;&lt; wird übersprungen. Wenn ich im operator&lt;&lt; &quot;switch ((unsigned)figur)&quot; schreibe, hilft das nichts.</p>
<p>Wer kann mir helfen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2379976</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2379976</guid><dc:creator><![CDATA[aaaaaaaaaaaaa]]></dc:creator><pubDate>Mon, 27 Jan 2014 17:51:36 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit enum und unsigned on Mon, 27 Jan 2014 17:58:23 GMT]]></title><description><![CDATA[<p>Folgendes (sehr unelegant, und funktioniert nicht mit &quot;schwarzerTurm&quot;) hat geholfen:</p>
<pre><code>typedef enum {leer = 0,
			weisserBauer = 1, weisserTurm = 2, weisserSpringer = 3, weisserLaeufer = 4, weisseDame = 5, weisserKoenig = 6,
			schwarzerBauer = 7, schwarzerTurm = 8, schwarzerSpringer = -7, schwarzerLaeufer = -6, schwarzeDame = -5, schwarzerKoenig = -4
} Figur; // 12 Figuren brauchen 4 Bit: 2^4 = 16
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2379977</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2379977</guid><dc:creator><![CDATA[aaaaaaaaaaaa]]></dc:creator><pubDate>Mon, 27 Jan 2014 17:58:23 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit enum und unsigned on Mon, 27 Jan 2014 17:59:18 GMT]]></title><description><![CDATA[<p>Klappt<br />
unsigned ziehendeFigur : 4;<br />
?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2379978</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2379978</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Mon, 27 Jan 2014 17:59:18 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit enum und unsigned on Mon, 27 Jan 2014 18:06:37 GMT]]></title><description><![CDATA[<p>Anscheinend ja! <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f60b.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_savoring_food"
      title=":yum:"
      alt="😋"
    /> <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>
]]></description><link>https://www.c-plusplus.net/forum/post/2379979</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2379979</guid><dc:creator><![CDATA[aaaaaaaaaaaa]]></dc:creator><pubDate>Mon, 27 Jan 2014 18:06:37 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit enum und unsigned on Tue, 28 Jan 2014 09:02:29 GMT]]></title><description><![CDATA[<p>Wenn man mal das ostream außen vor lässt, sieht mir der Code schon sehr stark nach C aus (&quot;typedef enum&quot; schreibt man unter C++ eigentlich nicht). Falls der Compiler schon C++11 unterstützt, kann man auch den zugrunde liegenden Integertyp des Enums setzen (Standard ist int).</p>
<p>Beispiel:</p>
<pre><code>enum Figur : unsigned int
{
    leer = 0,
    weisserBauer = 1,
    weisserTurm = 2,
    weisserSpringer = 3,
    weisserLaeufer = 4,
    weisseDame = 5,
    weisserKoenig = 6,
    schwarzerBauer = 7,
    schwarzerTurm = 8,
    schwarzerSpringer = 9,
    schwarzerLaeufer = 10,
    schwarzeDame = 11,
    schwarzerKoenig = 12
};
</code></pre>
<p>Des Weiteren ist mir die verwendete Syntax innerhalb der Struktur vollkommen unbekannt (&lt;typ&gt; &lt;bezeichner&gt; : &lt;wert&gt; kenne ich jetzt nicht überhaupt nicht von C++).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2380087</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2380087</guid><dc:creator><![CDATA[asc]]></dc:creator><pubDate>Tue, 28 Jan 2014 09:02:29 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit enum und unsigned on Tue, 28 Jan 2014 12:21:47 GMT]]></title><description><![CDATA[<p>asc schrieb:</p>
<blockquote>
<p>Des Weiteren ist mir die verwendete Syntax innerhalb der Struktur vollkommen unbekannt (&lt;typ&gt; &lt;bezeichner&gt; : &lt;wert&gt; kenne ich jetzt nicht überhaupt nicht von C++).</p>
</blockquote>
<p>Das ist vollkommen gültiges C++, wenn auch nicht mehr so häufig genutzt.<br />
Die Syntax wird für Bitfelder genutzt.</p>
<pre><code>struct Zug
{
    unsigned weisserSpielerAmZug : 1; // 1 Bit
    unsigned von : 6;                 // 6 Bit
    unsigned zu : 6;                  // 6 Bit
    Figur ziehendeFigur : 4;          // 4 Bit
    Figur geschlageneFigur : 4;       // 4 Bit
};
</code></pre>
<p>Allerdings sollte man schon extrem driftige Gründe haben, obiges zu schreiben.</p>
<pre><code>struct Zug
{
    unsigned char weisserSpielerAmZug; // 8 Bit (bzw. CHAR_BIT Bit, um genau zu sein)
    unsigned char von;                 // -||-
    unsigned char zu;                  // -||-
    Figur ziehendeFigur;               // hängt vom Compiler ab
    Figur geschlageneFigur;            // -||-
};
</code></pre>
<p>Diese modifizierte Variante ist zwar größer, dafür aber wesentlich schneller,<br />
da der Compiler hier nicht mit Bitshifts rumhantieren muss.</p>
<p>Noch besser wäre:</p>
<pre><code>struct Zug
{
    Figur ziehendeFigur;               // hängt vom Compiler ab
    Figur geschlageneFigur;            // -||-
    unsigned char weisserSpielerAmZug; // 8 Bit (bzw. CHAR_BIT Bit, um genau zu sein)
    unsigned char von;                 // -||-
    unsigned char zu;                  // -||-
};
</code></pre>
<p>sizeof(Figur) kann theoretisch größer als 1 werden. Wenn die beiden Figuren nach den unsigned char's kommen, fügen die meisten Compiler standardmäßig ein Füllbyte ein, was durch richtige Sortierung vermieden wird.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2380129</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2380129</guid><dc:creator><![CDATA[DrakoXP]]></dc:creator><pubDate>Tue, 28 Jan 2014 12:21:47 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit enum und unsigned on Tue, 28 Jan 2014 12:32:31 GMT]]></title><description><![CDATA[<p>DrakoXP schrieb:</p>
<blockquote>
<p>Noch besser wäre:</p>
<pre><code>struct Zug
{
    Figur ziehendeFigur;               // hängt vom Compiler ab
    Figur geschlageneFigur;            // -||-
    unsigned char weisserSpielerAmZug; // 8 Bit (bzw. CHAR_BIT Bit, um genau zu sein)
    unsigned char von;                 // -||-
    unsigned char zu;                  // -||-
};
</code></pre>
<p>sizeof(Figur) kann theoretisch größer als 1 werden. Wenn die beiden Figuren nach den unsigned char's kommen, fügen die meisten Compiler standardmäßig ein Füllbyte ein, was durch richtige Sortierung vermieden wird.</p>
</blockquote>
<p>Falsch. Es wird hier nur verschoben ans Ende.</p>
<pre><code>struct Zug
{
    unsigned char weisserSpielerAmZug;
    unsigned char von;
    unsigned char zu;
    char padding;
    Figur ziehendeFigur;
    Figur geschlageneFigur;
};
</code></pre>
<pre><code>struct Zug
{
    Figur ziehendeFigur;
    Figur geschlageneFigur;
    unsigned char weisserSpielerAmZug;
    unsigned char von;
    unsigned char zu;
    char padding;
};
</code></pre>
<p>Wenn sizeof(Figur)==4 oder mehr wird, dann kann man langsam Speicher verschwenden durch noch ungeschicktere Reihenfolge.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2380131</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2380131</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Tue, 28 Jan 2014 12:32:31 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit enum und unsigned on Tue, 28 Jan 2014 12:44:29 GMT]]></title><description><![CDATA[<p>aaaaaaaaaaaa schrieb:</p>
<blockquote>
<p>Folgendes (sehr unelegant, und funktioniert nicht mit &quot;schwarzerTurm&quot;) hat geholfen:</p>
<pre><code>typedef enum {leer = 0,
			weisserBauer = 1, weisserTurm = 2, weisserSpringer = 3, weisserLaeufer = 4, weisseDame = 5, weisserKoenig = 6,
			schwarzerBauer = 7, schwarzerTurm = 8, schwarzerSpringer = -7, schwarzerLaeufer = -6, schwarzeDame = -5, schwarzerKoenig = -4
} Figur; // 12 Figuren brauchen 4 Bit: 2^4 = 16
</code></pre>
</blockquote>
<p>Ich würde nur den ersten Wert explizit vergeben (z.B. -7), der Rest ergibt sich automatisch (der Wert für schwarzerTurm ist zu groß für 4 bits mit Vorzeichen).<br />
In C hängt es von der Implementation ab, ob des Bitfeld vorzeichenbehaftet ist oder nicht (der Typ von Figur ist dort int). In C++ ist hingegen festgelegt, dass (mit dem ursprünglichen Code) 4 bits ausreichen, der verwendete Compiler also wohl nicht konfrom.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2380136</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2380136</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Tue, 28 Jan 2014 12:44:29 GMT</pubDate></item></channel></rss>