<?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[Frage betreffend Union]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich habe folgendes Listing:</p>
<pre><code class="language-cpp">union tWandler
{
    struct
    {
        unsigned char hi;
        unsigned char lo;
    } byte;
    unsigned short word;
} Wandler;

int main()
{
    Wandler.word = 7656;
    cout &lt;&lt; (int)Wandler.byte.hi &lt;&lt; endl;
    cout &lt;&lt; (int)Wandler.byte.lo &lt;&lt; endl;
}
</code></pre>
<p>Könntet ihr mir erläutern bzw. weiss jemand, was dieser Code genau tut? Und werden solche Unions heute noch viel verwendet?</p>
<p>Vielen Dank schonmal!</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/261627/frage-betreffend-union</link><generator>RSS for Node</generator><lastBuildDate>Mon, 07 Sep 2026 03:47:05 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/261627.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 21 Feb 2010 16:42:01 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Frage betreffend Union on Sun, 21 Feb 2010 16:42:01 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich habe folgendes Listing:</p>
<pre><code class="language-cpp">union tWandler
{
    struct
    {
        unsigned char hi;
        unsigned char lo;
    } byte;
    unsigned short word;
} Wandler;

int main()
{
    Wandler.word = 7656;
    cout &lt;&lt; (int)Wandler.byte.hi &lt;&lt; endl;
    cout &lt;&lt; (int)Wandler.byte.lo &lt;&lt; endl;
}
</code></pre>
<p>Könntet ihr mir erläutern bzw. weiss jemand, was dieser Code genau tut? Und werden solche Unions heute noch viel verwendet?</p>
<p>Vielen Dank schonmal!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1859163</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1859163</guid><dc:creator><![CDATA[Miness]]></dc:creator><pubDate>Sun, 21 Feb 2010 16:42:01 GMT</pubDate></item><item><title><![CDATA[Reply to Frage betreffend Union on Sun, 21 Feb 2010 18:03:39 GMT]]></title><description><![CDATA[<p>In einer Union teilen sich die unterschiedlich enthaltenen Datentypen den gleichen Speicher. Belegst du ihn mit der Zahl 7656 fuer Word, so greift beim<br />
Auslesen der Struct diese auf den gleichen Speicher zu.</p>
<p>siehe folgendes Beispiel, das erklärt mehr oder weniger, warum das Ergebnis bei dir so aussieht, wie es aussieht:</p>
<pre><code class="language-cpp">unsigned short zahl = 7656;
	unsigned char res[2];

	memcpy(res, &amp;zahl, sizeof(unsigned short));
	cout &lt;&lt; zahl &lt;&lt; endl;
	cout &lt;&lt; (int)res[0] &lt;&lt; endl;
	cout &lt;&lt; (int)res[1] &lt;&lt; endl;
</code></pre>
<p>EDIT:<br />
vielleicht noch ergaenzend<br />
Deine Zahl 7656 sieht Binaer so aus und wird dann auf char[2] &quot;verteilt&quot;</p>
<pre><code>BYTE res[1]  BYTE res[0]
00011101     11101000        =&gt; 7656
=29          =232
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1859195</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1859195</guid><dc:creator><![CDATA[BasicMan01]]></dc:creator><pubDate>Sun, 21 Feb 2010 18:03:39 GMT</pubDate></item><item><title><![CDATA[Reply to Frage betreffend Union on Sun, 21 Feb 2010 18:03:50 GMT]]></title><description><![CDATA[<p>OK, danke!<br />
Aber warum kommt als Ergebnis ausgerechnet 232 und 29 raus?<br />
Wenn es der gleiche Speicherbereich ist, müsste doch einfach ein gewisser Teil vom Speicherbereich von &quot;word&quot; ausgegeben werden?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1859201</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1859201</guid><dc:creator><![CDATA[Miness]]></dc:creator><pubDate>Sun, 21 Feb 2010 18:03:50 GMT</pubDate></item><item><title><![CDATA[Reply to Frage betreffend Union on Sun, 21 Feb 2010 18:05:49 GMT]]></title><description><![CDATA[<p>Dieser Code gibt dir das erste und das zweite Byte einer zwei chars umfassenden short Variable aus. Dieses Verhalten ist in vielerlei Hinsicht undefiniert, wird aber auf vielen Systemen funktionieren, zumindest auf denen, wo sizeof(short)=2 ist und die shorts im Big-endian Format abspeichern.</p>
<p>Ich nehme mal an, wenn du nach unions fragst, dann hast du dich zumindest ein bisschen mit dem Thema beschäftigt und weißt, was sie machen. Das werde ich hier nämlich nicht erklären.</p>
<p>Dies ist die Idee des Programmierers: Zuerst speichert das Programm einen short Wert in der union als Wandler.word. Vorausgesetzt, sizeof(short)=2 und Big-Endian für shorts, steht im Speicher dann sowas:</p>
<pre><code>--------------------------------------------------
| Erster Teil von Word  | Zweiter Teil von Word  |
--------------------------------------------------

|                Wandler.Word                    |
|-----------------  Wandler ---------------------|
</code></pre>
<p>Da es sich um eine union handelt, kann der gleiche Speicher aber auch so angesprochen werden:</p>
<pre><code>--------------------------------------------------
|    Wandler.hi         |     Wandler.lo         |
--------------------------------------------------

|-----------------  Wandler ---------------------|
</code></pre>
<p>Und so kann man zwei chars aus dem short Wert erhalten.</p>
<p>Nun die Probleme:<br />
1. Der Standard sagt explizit, dass das Verhalten von unions nur definiert ist, wenn man wieder das gleiche Element liest, dass man vorher gespeichert hat. Also eigentlich dürfte das Programm nach dem Speichern des shorts die union nur als short ansprechen, wenn das Verhalten definiert sein soll. Dass es trotzdem funktioniert liegt daran, dass praktisch alle Compiler unions so implementieren wie oben erklärt. Sie brauchen es aber nicht zwangsläufig so zu machen.<br />
2. Es werden allerlei Annahmen gemacht, die nicht unbedingt erfüllt sind. Weder sizeof(short)=2 noch das Format in dem ein short im Speicher liegt sind definiert.</p>
<p>Die Verwendung von unions ist eher ungewöhnlich, sie sind eigentlich ein Relikt aus Speichersparzeiten. Denn eigentlich sind sie dazu gut, Variablen platzsparend zu speichern. Die Verwendung wie hier ist ziemlich unsauber, wie schon erläutert. Man könnte genausogut einen reinterpret_cast machen. Oder besser noch: Rechnen. Denn dann ist man auf der sicheren Seite.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1859203</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1859203</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Sun, 21 Feb 2010 18:05:49 GMT</pubDate></item><item><title><![CDATA[Reply to Frage betreffend Union on Sun, 21 Feb 2010 18:11:36 GMT]]></title><description><![CDATA[<p>Okay, vielen Dank euch für die ausführliche Erklärung!<br />
So wie ich das sehe sollten also Unions eigentlich nicht mehr verwendet werden, aber es ist natürlich trotzdem praktisch zu wissen wie sie funktionieren - und jetzt ist alles klar! <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";-)"
      alt="😉"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1859204</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1859204</guid><dc:creator><![CDATA[Miness]]></dc:creator><pubDate>Sun, 21 Feb 2010 18:11:36 GMT</pubDate></item><item><title><![CDATA[Reply to Frage betreffend Union on Sun, 21 Feb 2010 18:18:42 GMT]]></title><description><![CDATA[<p>Miness schrieb:</p>
<blockquote>
<p>Okay, vielen Dank euch für die ausführliche Erklärung!<br />
So wie ich das sehe sollten also Unions eigentlich nicht mehr verwendet werden, aber es ist natürlich trotzdem praktisch zu wissen wie sie funktionieren - und jetzt ist alles klar! <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";-)"
      alt="😉"
    /></p>
</blockquote>
<p>Es kann schon Sinn machen, du solltest sie nicht aus Prinzip nicht verwenden. Nur ist es halt relativ selten, dass man sie zu ihrem eigentlichen Einsatzzweck braucht.</p>
<p>Den Missbrauch wie in deinem Beispiel, sollte man aber vermeiden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1859209</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1859209</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Sun, 21 Feb 2010 18:18:42 GMT</pubDate></item><item><title><![CDATA[Reply to Frage betreffend Union on Sun, 21 Feb 2010 19:28:43 GMT]]></title><description><![CDATA[<p>SeppJ schrieb:</p>
<blockquote>
<p>Es kann schon Sinn machen, du solltest sie nicht aus Prinzip nicht verwenden. Nur ist es halt relativ selten, dass man sie zu ihrem eigentlichen Einsatzzweck braucht.</p>
<p>Den Missbrauch wie in deinem Beispiel, sollte man aber vermeiden.</p>
</blockquote>
<p>Klar, aus Prinzip nicht verwenden ist immer schlecht. Aber kannst du mir ein konkretes Beispiel für den Einsatzzweck nennen? Ich sehe dahinter im Moment noch nicht wirklich einen Sinn (ausser zum Sparen von Speicherplatz).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1859240</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1859240</guid><dc:creator><![CDATA[Miness]]></dc:creator><pubDate>Sun, 21 Feb 2010 19:28:43 GMT</pubDate></item><item><title><![CDATA[Reply to Frage betreffend Union on Sun, 21 Feb 2010 19:36:09 GMT]]></title><description><![CDATA[<p>Small String Optimization.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1859243</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1859243</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Sun, 21 Feb 2010 19:36:09 GMT</pubDate></item><item><title><![CDATA[Reply to Frage betreffend Union on Sun, 21 Feb 2010 19:38:10 GMT]]></title><description><![CDATA[<p>volkard schrieb:</p>
<blockquote>
<p>Small String Optimization.</p>
</blockquote>
<p>Sorry für die Frage, aber was ist das? <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";-)"
      alt="😉"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1859245</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1859245</guid><dc:creator><![CDATA[Miness]]></dc:creator><pubDate>Sun, 21 Feb 2010 19:38:10 GMT</pubDate></item><item><title><![CDATA[Reply to Frage betreffend Union on Sun, 21 Feb 2010 20:02:36 GMT]]></title><description><![CDATA[<p>Miness schrieb:</p>
<blockquote>
<p>Okay, vielen Dank euch für die ausführliche Erklärung!<br />
So wie ich das sehe sollten also Unions eigentlich nicht mehr verwendet werden</p>
</blockquote>
<p>&quot;Nicht verwenden&quot; stimmt nicht. Du kannt nur nicht, bezogen auf obiges Beispiel, darauf schliessen was in &quot;word&quot; steht, wenn Du &quot;byte&quot; beschrieben hast und umgekehrt. In einer Union ist nur das zuletzt beschriebene Element gültig. Zum Zerlegen eines 2-Byte Wertes in einzelne Bytes sind Unions nicht geeignet. Dazu nimm lieber Shift-Operatoren.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1859256</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1859256</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Sun, 21 Feb 2010 20:02:36 GMT</pubDate></item><item><title><![CDATA[Reply to Frage betreffend Union on Sun, 21 Feb 2010 20:03:54 GMT]]></title><description><![CDATA[<p>Laß einen String drei Zeiger schwer sein, begin, end und maxEnd (weil mehr SPeicgher angelegt sein könnte, als gerade benutzt wird). 12 Bytes.<br />
Dann kann man sich gleich auch den Luxus gönnen und 16 Bytes nehmen und die ersten vier Bytes zeigen den echten typ des Strings an, einer der Untertypen ist der Kurz-String, der hat in den anderen 12 Bytes gleich die Nutzdaten.</p>
<pre><code class="language-cpp">class String{
   virtual ~String();//die ersten 4 Bytes
   union{
      struct{//normal mit new angelegt
        char* begin;
        char* end;
        char* maxEnd;
      }
      struct{//kleiner string
        char length;
        char data[11];
      }
      struct{//literal
        char* begin;
        char* end;
      }
   }
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1859257</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1859257</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Sun, 21 Feb 2010 20:03:54 GMT</pubDate></item><item><title><![CDATA[Reply to Frage betreffend Union on Sun, 21 Feb 2010 20:21:30 GMT]]></title><description><![CDATA[<p>Z schrieb:</p>
<blockquote>
<p>&quot;Nicht verwenden&quot; stimmt nicht. Du kannt nur nicht, bezogen auf obiges Beispiel, darauf schliessen was in &quot;word&quot; steht, wenn Du &quot;byte&quot; beschrieben hast und umgekehrt. In einer Union ist nur das zuletzt beschriebene Element gültig. Zum Zerlegen eines 2-Byte Wertes in einzelne Bytes sind Unions nicht geeignet. Dazu nimm lieber Shift-Operatoren.</p>
</blockquote>
<p>Sehe ich das richtig, dass Shift-Operatoren bitweise kopieren können?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1859267</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1859267</guid><dc:creator><![CDATA[Miness]]></dc:creator><pubDate>Sun, 21 Feb 2010 20:21:30 GMT</pubDate></item><item><title><![CDATA[Reply to Frage betreffend Union on Sun, 21 Feb 2010 20:32:25 GMT]]></title><description><![CDATA[<p>Miness schrieb:</p>
<blockquote>
<p>Z schrieb:</p>
<blockquote>
<p>&quot;Nicht verwenden&quot; stimmt nicht. Du kannt nur nicht, bezogen auf obiges Beispiel, darauf schliessen was in &quot;word&quot; steht, wenn Du &quot;byte&quot; beschrieben hast und umgekehrt. In einer Union ist nur das zuletzt beschriebene Element gültig. Zum Zerlegen eines 2-Byte Wertes in einzelne Bytes sind Unions nicht geeignet. Dazu nimm lieber Shift-Operatoren.</p>
</blockquote>
<p>Sehe ich das richtig, dass Shift-Operatoren bitweise kopieren können?</p>
</blockquote>
<p>Nein, die rechnen bloß. Das sieht dann aber so aus, als hätten sie bitweise kopiert.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1859273</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1859273</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Sun, 21 Feb 2010 20:32:25 GMT</pubDate></item><item><title><![CDATA[Reply to Frage betreffend Union on Mon, 22 Feb 2010 10:42:15 GMT]]></title><description><![CDATA[<p>Einen Sinn machen Unions auch wenn man mit Streams irgend einer Art arbeitet und es bevorzugt wenn zwar unterschiedliche Datentypen verschickt werden, diese aber der Einfachheit halbe immer die gleiche Länge haben sollen. Sieht dann in etwa so aus:</p>
<pre><code class="language-cpp">struct tMessage{
  tMessageTyp type;
  union{
    tLargeMessage large;
    tShortMessage short;
    tWhateverMessage whatever;
    int nureinint;
    tUndSoweiter undsoweiter;
  };
};
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1859403</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1859403</guid><dc:creator><![CDATA[Fellhuhn]]></dc:creator><pubDate>Mon, 22 Feb 2010 10:42:15 GMT</pubDate></item></channel></rss>