<?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[Static-cast von char* zu unsigned char*]]></title><description><![CDATA[<p>Hallo an alle,</p>
<p>ich bin heute auf folgendes Problem gestossen:</p>
<pre><code class="language-cpp">int main()
{
  char* pC = &quot;Hello World&quot;;

  unsigned char* pUC = static_cast&lt; unsigned char* &gt;( pC );
}
</code></pre>
<p>Bevor ich den Code kompiliert habe, dachte ich noch, das wäre kein Problem. Allerdings sieht das der Compiler komplett anders.</p>
<blockquote>
<p>1&gt;Main.cpp<br />
1&gt;c:\dokumente und einstellungen\LordHong\eigene dateien\mytestarea\testproject\main.cpp(42) : error C2440: 'static_cast' : cannot convert from 'char *' to 'unsigned char *'<br />
1&gt; Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast</p>
</blockquote>
<p>Dumm ist nun, das ich nicht verstehe, was ihn nun stört. Natürlich klappt es wenn ich einen reinterpret_cast benutze. Allerdings ist meine Verwunderung immer noch nicht aus meinem Gesicht verschwunden.</p>
<p>Was stört den Compiler? Warum kann ich den Zeiger von char* nicht auf unsigned char* umcasten? Was meint der Compiler mit &quot;Types pointed to are unrelated&quot;?</p>
<p>Danke im Voraus für Eure Hilfe.</p>
<p>Gruß<br />
Lord Hong</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/226210/static-cast-von-char-zu-unsigned-char</link><generator>RSS for Node</generator><lastBuildDate>Thu, 01 Oct 2026 00:03:37 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/226210.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 30 Oct 2008 16:54:48 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Static-cast von char* zu unsigned char* on Thu, 30 Oct 2008 16:54:48 GMT]]></title><description><![CDATA[<p>Hallo an alle,</p>
<p>ich bin heute auf folgendes Problem gestossen:</p>
<pre><code class="language-cpp">int main()
{
  char* pC = &quot;Hello World&quot;;

  unsigned char* pUC = static_cast&lt; unsigned char* &gt;( pC );
}
</code></pre>
<p>Bevor ich den Code kompiliert habe, dachte ich noch, das wäre kein Problem. Allerdings sieht das der Compiler komplett anders.</p>
<blockquote>
<p>1&gt;Main.cpp<br />
1&gt;c:\dokumente und einstellungen\LordHong\eigene dateien\mytestarea\testproject\main.cpp(42) : error C2440: 'static_cast' : cannot convert from 'char *' to 'unsigned char *'<br />
1&gt; Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast</p>
</blockquote>
<p>Dumm ist nun, das ich nicht verstehe, was ihn nun stört. Natürlich klappt es wenn ich einen reinterpret_cast benutze. Allerdings ist meine Verwunderung immer noch nicht aus meinem Gesicht verschwunden.</p>
<p>Was stört den Compiler? Warum kann ich den Zeiger von char* nicht auf unsigned char* umcasten? Was meint der Compiler mit &quot;Types pointed to are unrelated&quot;?</p>
<p>Danke im Voraus für Eure Hilfe.</p>
<p>Gruß<br />
Lord Hong</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1607338</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1607338</guid><dc:creator><![CDATA[lord.hong]]></dc:creator><pubDate>Thu, 30 Oct 2008 16:54:48 GMT</pubDate></item><item><title><![CDATA[Reply to Static-cast von char* zu unsigned char* on Thu, 30 Oct 2008 17:02:39 GMT]]></title><description><![CDATA[<p>damit meint er, dass die zwei typen nun eben zwei (unterschiedliche) typen sind.<br />
genauso wird dir ein</p>
<pre><code class="language-cpp">double* foo (int* i)
{
   return static_cast&lt;double&gt;(i);
}
</code></pre>
<p>um die ohren fliegen.</p>
<p>netterweise schlägt dir dein compiler auch gleich eine lösung vor <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
<p>/edit: code-tags repariert</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1607344</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1607344</guid><dc:creator><![CDATA[queer_boy]]></dc:creator><pubDate>Thu, 30 Oct 2008 17:02:39 GMT</pubDate></item><item><title><![CDATA[Reply to Static-cast von char* zu unsigned char* on Fri, 31 Oct 2008 11:15:13 GMT]]></title><description><![CDATA[<p>Hallo queer_boy,</p>
<p>nun habe ich allerdings eine anderes Problem. Was verstehst du unter einen Typen?</p>
<p>Als Build-In Typen verstehe ich int, double, float, bool, long etc.</p>
<p>Aber einen Zeiger auf eine Typ verstehe ich nicht als Typ. Für mich ist char* ein Zeiger auf den Typ Character.</p>
<p>In deinem Beispiel lautet die Fehlermeldung auch anders:</p>
<blockquote>
<p>1&gt;c:\dokumente und einstellungen\LordHong\eigene dateien\mytestarea\testproject\main.cpp(39) : error C2440: 'static_cast' : cannot convert from 'int *' to 'double'<br />
1&gt; There is no context in which this conversion is possible</p>
</blockquote>
<p>Mist, das verstehe ich immer noch nicht. Bin ich nun wieder im ersten Semester gelandet. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f621.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--pouting_face"
      title=":rage:"
      alt="😡"
    /></p>
<p>Nach meinem Verständnis hätte auch dein Code kompilieren müssen. foo nimmt den Zeiger auf einen Integer. Dann hätte nicht der Wert in ein Double gecastet werden müssen, wohin es zeigt, sondern die Adresse wohin gezeigt wird. Aber der Compiler verweigert die Arbeit.</p>
<p>Ich habe es erstmal nicht verstanden, aber Danke, dass du mir was zu denken gegeben hast.</p>
<p>Gruß<br />
Lord Hong</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1607962</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1607962</guid><dc:creator><![CDATA[lord.hong]]></dc:creator><pubDate>Fri, 31 Oct 2008 11:15:13 GMT</pubDate></item><item><title><![CDATA[Reply to Static-cast von char* zu unsigned char* on Fri, 31 Oct 2008 11:19:03 GMT]]></title><description><![CDATA[<p>queer_boy schrieb:</p>
<blockquote>
<p>damit meint er, dass die zwei typen nun eben zwei (unterschiedliche) typen sind.<br />
genauso wird dir ein</p>
<pre><code class="language-cpp">double* foo (int* i)
{
   return static_cast&lt;double&gt;(i);
}
</code></pre>
<p>um die ohren fliegen.</p>
<p>netterweise schlägt dir dein compiler auch gleich eine lösung vor <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
<p>/edit: code-tags repariert</p>
</blockquote>
<p>Sollte wohl double* sein, oder?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1607967</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1607967</guid><dc:creator><![CDATA[Fellhuhn]]></dc:creator><pubDate>Fri, 31 Oct 2008 11:19:03 GMT</pubDate></item><item><title><![CDATA[Reply to Static-cast von char* zu unsigned char* on Fri, 31 Oct 2008 12:09:32 GMT]]></title><description><![CDATA[<p>Auch Zeiger sind Typen. Nämlich Typ &quot;Zeiger auf Typ X&quot;.</p>
<p>Und so wenig wie int und double verwandt sind, sind int* und double verwandt, oder int* und double*.</p>
<p>Was ist denn jetzt das Problem darin, reinterpret_cast zu verwenden? <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1608011</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1608011</guid><dc:creator><![CDATA[LordJaxom]]></dc:creator><pubDate>Fri, 31 Oct 2008 12:09:32 GMT</pubDate></item><item><title><![CDATA[Reply to Static-cast von char* zu unsigned char* on Fri, 31 Oct 2008 12:31:46 GMT]]></title><description><![CDATA[<p>Ich finde das auch eine völlig bescheuerte Regelung. Müsste nicht auch laut Standard <code>sizeof(int)==sizeof(unsigned int)</code> gegeben sein? Ein reinterpret_cast ist eigentlich für &quot;riskante&quot; Umwandlungen da, während char*-&gt;unsigned char* völlig Pipi ist, einfach risikolos.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1608025</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1608025</guid><dc:creator><![CDATA[Badestrand]]></dc:creator><pubDate>Fri, 31 Oct 2008 12:31:46 GMT</pubDate></item><item><title><![CDATA[Reply to Static-cast von char* zu unsigned char* on Fri, 31 Oct 2008 15:18:53 GMT]]></title><description><![CDATA[<p>Hi,</p>
<p>nun ist mir auch klar warum es problematisch ist und warum es mit einem static_cast nicht klappen kann.</p>
<pre><code>int main()
{
  int i = 65000;
  int* pI = &amp;i;

  char* pC = reinterpret_cast&lt;char*&gt;( pI );

  for (int i = 0; i &lt; sizeof( int ); ++i )
    std::cout &lt;&lt; &quot;Value: &quot; &lt;&lt; pC[i] &lt;&lt; std::endl;
}
</code></pre>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/10648">@LordJaxom</a><br />
S. Beispiel oben, des Wegen meide ich reinterpret_casts.</p>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/13210">@Badestrand</a><br />
Von deiner Denkstruktur habe ich wohl was übernommen. Auch ich ging die ganze Zeit davon aus das ein char und ein unsigned char ein Byte groß seien.</p>
<p>Ein char* zu einem unsigned char* enfand ich als unkompliziert, weil beide die gleiche Größe haben. Nun bin ich mir aber auch nicht mehr sicher, da ein int* zu einem char* mit Informationsverluste behaftet ist.</p>
<p>Anscheinend caste ich zu selten. <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>
<p>Vielen Dank an alle.</p>
<p>Lord Hong</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1608139</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1608139</guid><dc:creator><![CDATA[lord.hong]]></dc:creator><pubDate>Fri, 31 Oct 2008 15:18:53 GMT</pubDate></item><item><title><![CDATA[Reply to Static-cast von char* zu unsigned char* on Fri, 31 Oct 2008 17:22:28 GMT]]></title><description><![CDATA[<p>Fellhuhn schrieb:</p>
<blockquote>
<p>queer_boy schrieb:</p>
<blockquote>
<p>damit meint er, dass die zwei typen nun eben zwei (unterschiedliche) typen sind.<br />
genauso wird dir ein</p>
<pre><code class="language-cpp">double* foo (int* i)
{
   return static_cast&lt;double&gt;(i);
}
</code></pre>
<p>um die ohren fliegen.</p>
<p>netterweise schlägt dir dein compiler auch gleich eine lösung vor <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
<p>/edit: code-tags repariert</p>
</blockquote>
<p>Sollte wohl double* sein, oder?</p>
</blockquote>
<p>dummer fehler, ja. führte leider zu noch mehr unklarheiten ^^'</p>
<p>Badestrand schrieb:</p>
<blockquote>
<p>Ich finde das auch eine völlig bescheuerte Regelung. Müsste nicht auch laut Standard sizeof(int)==sizeof(unsigned int) gegeben sein? Ein reinterpret_cast ist eigentlich für &quot;riskante&quot; Umwandlungen da, während char*-&gt;unsigned char* völlig Pipi ist, einfach risikolos.</p>
</blockquote>
<p>ist es nicht. werte können völlig unterschiedlich dargestellt werden; das einzig absurde könnte sein, dass char womöglich &quot;tatsächlich&quot; unsigned char ist (wenn nicht, dann signed char) - nichtsdestotrotz sind es unterschiedliche typen, und das ist einer der (wenigen) berechtigten und wohldefinierten einsatzmöglichkeiten für einen reinterpret_cast,</p>
<p>lord.hong schrieb:</p>
<blockquote>
<pre><code>int main()
{
  int i = 65000;
  int* pI = &amp;i;

  char* pC = reinterpret_cast&lt;char*&gt;( pI );

  for (int i = 0; i &lt; sizeof( int ); ++i )
    std::cout &lt;&lt; &quot;Value: &quot; &lt;&lt; pC[i] &lt;&lt; std::endl;
}
</code></pre>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/10648">@LordJaxom</a><br />
S. Beispiel oben, des Wegen meide ich reinterpret_casts.</p>
</blockquote>
<p>genauso wie dieser cast. genau dazu gibt es auf dieser seite in der übersicht noch einen weiteren thread, wo ich 3.10/15 zitiere.</p>
<blockquote>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/13210">@Badestrand</a><br />
Von deiner Denkstruktur habe ich wohl was übernommen. Auch ich ging die ganze Zeit davon aus das ein char und ein unsigned char ein Byte groß seien.</p>
</blockquote>
<p>ein char hat die größe eines bytes, aber nur per definitionem. (und ein byte hat exact <code>numeric_limits&lt;char&gt;::digits()</code> bits)</p>
<blockquote>
<p>Ein char* zu einem unsigned char* enfand ich als unkompliziert, weil beide die gleiche Größe haben. Nun bin ich mir aber auch nicht mehr sicher, da ein int* zu einem char* mit Informationsverluste behaftet ist.</p>
</blockquote>
<p>wenn du es wieder rückverwandelst, sollte es denselben wert darstellen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1608186</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1608186</guid><dc:creator><![CDATA[queer_boy]]></dc:creator><pubDate>Fri, 31 Oct 2008 17:22:28 GMT</pubDate></item><item><title><![CDATA[Reply to Static-cast von char* zu unsigned char* on Fri, 31 Oct 2008 19:20:30 GMT]]></title><description><![CDATA[<p>Wieso wurden überhaupt drei Typen für Charaktere eingeführt ( <code>char</code> , <code>signed char</code> , <code>unsigned char</code> )? Wäre es nicht einfacher gewesen, wenigstens hier konsequent zu sein und es gleich wie bei <code>short</code> , <code>int</code> und <code>long</code> zu regeln? <code>wchar_t</code> ist z.B. wieder eine Sache für sich...</p>
<p>queer_boy schrieb:</p>
<blockquote>
<p>genau dazu gibt es auf dieser seite in der übersicht noch einen weiteren thread, wo ich 3.10/15 zitiere.</p>
</blockquote>
<p>Das wäre dann <a href="http://www.c-plusplus.net/forum/viewtopic-var-t-is-226109.html" rel="nofollow">dieser hier</a>. <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/1608231</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1608231</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Fri, 31 Oct 2008 19:20:30 GMT</pubDate></item><item><title><![CDATA[Reply to Static-cast von char* zu unsigned char* on Fri, 31 Oct 2008 21:46:08 GMT]]></title><description><![CDATA[<p>queer_boy schrieb:</p>
<blockquote>
<p>Badestrand schrieb:</p>
<blockquote>
<p>Ich finde das auch eine völlig bescheuerte Regelung. Müsste nicht auch laut Standard sizeof(int)==sizeof(unsigned int) gegeben sein? Ein reinterpret_cast ist eigentlich für &quot;riskante&quot; Umwandlungen da, während char*-&gt;unsigned char* völlig Pipi ist, einfach risikolos.</p>
</blockquote>
<p>ist es nicht. werte können völlig unterschiedlich dargestellt werden; das einzig absurde könnte sein, dass char womöglich &quot;tatsächlich&quot; unsigned char ist (wenn nicht, dann signed char) - nichtsdestotrotz sind es unterschiedliche typen, und das ist einer der (wenigen) berechtigten und wohldefinierten einsatzmöglichkeiten für einen reinterpret_cast,</p>
</blockquote>
<p>&quot;int*&quot;&lt;-&gt;&quot;unsigned int*&quot; sind zwar verschiedene Typen aber meiner Meinung nach &quot;weniger unterschiedlich&quot; als z.B. &quot;int*&quot;&lt;-&gt;&quot;double*&quot;. Aber gut, das ist vielleicht Anssichtssache, ich jedenfalls hätte mir hier einen static-cast gewünscht. Einen reinterpret-cast verbinde ich immer mit &quot;Unreinheit&quot;, während mir diese Konvertierung sehr &quot;rein&quot; vorkommt. Wie auch immer.. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1608273</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1608273</guid><dc:creator><![CDATA[Badestrand]]></dc:creator><pubDate>Fri, 31 Oct 2008 21:46:08 GMT</pubDate></item><item><title><![CDATA[Reply to Static-cast von char* zu unsigned char* on Mon, 03 Nov 2008 13:33:27 GMT]]></title><description><![CDATA[<p>queer_boy schrieb:</p>
<blockquote>
<p>Fellhuhn schrieb:</p>
<blockquote>
<p>queer_boy schrieb:</p>
<blockquote>
<p>damit meint er, dass die zwei typen nun eben zwei (unterschiedliche) typen sind.<br />
genauso wird dir ein</p>
<pre><code class="language-cpp">double* foo (int* i)
{
   return static_cast&lt;double&gt;(i);
}
</code></pre>
<p>um die ohren fliegen.</p>
<p>netterweise schlägt dir dein compiler auch gleich eine lösung vor <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
<p>/edit: code-tags repariert</p>
</blockquote>
<p>Sollte wohl double* sein, oder?</p>
</blockquote>
<p>dummer fehler, ja. führte leider zu noch mehr unklarheiten ^^'</p>
</blockquote>
<p>Ach natürlich! Super ihr zwei! Nun ist es auch mir klar, warum das Ganze nur mit einem reinterpret_cast funktionieren kann! <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/1609428</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1609428</guid><dc:creator><![CDATA[lord.hong]]></dc:creator><pubDate>Mon, 03 Nov 2008 13:33:27 GMT</pubDate></item></channel></rss>