<?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[unsigned char negieren]]></title><description><![CDATA[<p>Hallo,<br />
ich habe in meinem Code etwa sowas:</p>
<pre><code class="language-cpp">unsigned char a = 20;
std::cout &lt;&lt; (static_cast&lt;int&gt;(a) ^ 0x80000000) &lt;&lt; std::endl;
</code></pre>
<p>Damit möchte ich die Variable a negieren. Allerdings wird trotz dem <code>static_cast&lt;int&gt;</code> die Variable als unsigned interpretiert und statt -20 liefert mit cout 2147483668.<br />
Wie kann ich das Problem lösen?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/287052/unsigned-char-negieren</link><generator>RSS for Node</generator><lastBuildDate>Thu, 20 Aug 2026 14:40:40 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/287052.rss" rel="self" type="application/rss+xml"/><pubDate>Sat, 21 May 2011 10:07:17 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to unsigned char negieren on Sat, 21 May 2011 10:07:17 GMT]]></title><description><![CDATA[<p>Hallo,<br />
ich habe in meinem Code etwa sowas:</p>
<pre><code class="language-cpp">unsigned char a = 20;
std::cout &lt;&lt; (static_cast&lt;int&gt;(a) ^ 0x80000000) &lt;&lt; std::endl;
</code></pre>
<p>Damit möchte ich die Variable a negieren. Allerdings wird trotz dem <code>static_cast&lt;int&gt;</code> die Variable als unsigned interpretiert und statt -20 liefert mit cout 2147483668.<br />
Wie kann ich das Problem lösen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2066686</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2066686</guid><dc:creator><![CDATA[Pikkolini]]></dc:creator><pubDate>Sat, 21 May 2011 10:07:17 GMT</pubDate></item><item><title><![CDATA[Reply to unsigned char negieren on Sat, 21 May 2011 10:11:22 GMT]]></title><description><![CDATA[<p><a href="http://ideone.com/DFDnV" rel="nofollow">http://ideone.com/DFDnV</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2066688</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2066688</guid><dc:creator><![CDATA[314159265358979]]></dc:creator><pubDate>Sat, 21 May 2011 10:11:22 GMT</pubDate></item><item><title><![CDATA[Reply to unsigned char negieren on Sat, 21 May 2011 10:14:41 GMT]]></title><description><![CDATA[<p>int ^ uint = uint. Wenn du den zweiten Typ zu int castest, erhälst du ein negatives Ergebnis, allerdings nicht -20, was du vielleicht erwarten würdest. Wenn du -20 mit XOR erreichen willst, musst du beim Zweierkomplement schon Folgendes machen:</p>
<pre><code class="language-cpp">unsigned char a = 20;
std::cout &lt;&lt; (static_cast&lt;int&gt;(a) ^ static_cast&lt;int&gt;(0xFFFFFFFF)) + 1 &lt;&lt; std::endl;
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2066689</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2066689</guid><dc:creator><![CDATA[Michael E.]]></dc:creator><pubDate>Sat, 21 May 2011 10:14:41 GMT</pubDate></item><item><title><![CDATA[Reply to unsigned char negieren on Sat, 21 May 2011 10:16:41 GMT]]></title><description><![CDATA[<p>&quot;unsigned&quot; steht für vorzeichenlos, da ist negieren ein wenig witzlos. Und in deinem Beispiel kommt noch die integral promotion (0x80000000 ist zu groß um int zu sein, also wird auf unsigned int umgeschaltet) und die Zweierkomplement-Darstellung (x ^ 0x80000000 ist was anderes als -x) dazwischen.<br />
Wenn du unbedingt den negierten Wert deines unsigned char ausgeben willst, mußt du ihn erst in einen vorzeichenbehafteten Typ casten und dann negieren - also <code>-static_cast&lt;int&gt;(a)</code> .</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2066690</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2066690</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Sat, 21 May 2011 10:16:41 GMT</pubDate></item><item><title><![CDATA[Reply to unsigned char negieren on Mon, 23 May 2011 10:32:36 GMT]]></title><description><![CDATA[<p>Pikkolini schrieb:</p>
<blockquote>
<pre><code class="language-cpp">unsigned char a = 20;
std::cout &lt;&lt; (static_cast&lt;int&gt;(a) ^ 0x80000000) &lt;&lt; std::endl;
</code></pre>
<p>Damit möchte ich die Variable a negieren. Allerdings wird trotz dem <code>static_cast&lt;int&gt;</code> die Variable als unsigned interpretiert und statt -20 liefert mit cout 2147483668.</p>
</blockquote>
<p>Beschäftige Dich mit<br />
- <a href="http://www.google.de/search?q=integral+promotion+c%2B%2B" rel="nofollow">integral promotion c++</a><br />
- <a href="http://www.google.de/search?q=usual+arithmetic+conversions+c%2B%2B" rel="nofollow">usual arithmetic conversions c++</a><br />
- <a href="http://www.google.de/search?q=integer+literals+c%2B%2B" rel="nofollow">integer literals c++</a><br />
(und/oder siehe C++ Buch Deiner Wahl)</p>
<p>Auf einem 32Bit-System ist durchaus zu erwarten, dass 0x8000000 vom Typ &quot;unsigned int&quot; ist. Dann hättest Du &quot;signed int ^ unsigned int&quot; wobei für den ersten Operand eine der &quot;usual arithmetic conversions&quot; durchgeführt wird, welche die linke Seite wieder vorzeichenlos macht. Der ganze Ausdruck ist damit vorzeichenlos und vom Typ &quot;unsigned int&quot;.</p>
<p>Schreibst Du stattdessen einfach -a findet eine integral promotion statt (unsigned char -&gt; signed int (1)) und der int-Wert wird wegen des unären Minusoperators negiert.</p>
<p>(1: Der Zieltyp ist &quot;unsigned int&quot;, falls &quot;signed int&quot; den Wertebereich von &quot;unsigned char&quot; nicht komplett abdeckt. UCHR_MAX &gt; INT_MAX ist aber unwahrscheinlich)</p>
<p>kk</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2067378</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2067378</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Mon, 23 May 2011 10:32:36 GMT</pubDate></item></channel></rss>