<?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[32-bit unsigned int Typecast]]></title><description><![CDATA[<p>Hallo,<br />
ich habe gerade meine Probleme mit einem Typecast, der in C++ wohl offensichtlich anders abläuft als in ActionScript 3.0 (Flash).</p>
<p>Code in Flash:</p>
<pre><code class="language-cpp">var test:uint;
test = Number(&quot;633876643524492195&quot;);

trace(test);
</code></pre>
<p>Ausgabe:<br />
3903961984</p>
<p>Hier der Code in c++:</p>
<pre><code class="language-cpp">unsigned int i = (int) 633876643524492195;
TRACE(&quot;i is %u\r\n&quot;,i);
</code></pre>
<p>Ausgabe:<br />
3903962019</p>
<p>Ich will in c++ auf den gleichen Wert kommen wie in Flash.<br />
Ich freue mich über jede Hilfe!</p>
<p>Michael</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/249291/32-bit-unsigned-int-typecast</link><generator>RSS for Node</generator><lastBuildDate>Wed, 16 Sep 2026 14:29:46 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/249291.rss" rel="self" type="application/rss+xml"/><pubDate>Sat, 05 Sep 2009 12:53:32 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to 32-bit unsigned int Typecast on Sat, 05 Sep 2009 12:53:32 GMT]]></title><description><![CDATA[<p>Hallo,<br />
ich habe gerade meine Probleme mit einem Typecast, der in C++ wohl offensichtlich anders abläuft als in ActionScript 3.0 (Flash).</p>
<p>Code in Flash:</p>
<pre><code class="language-cpp">var test:uint;
test = Number(&quot;633876643524492195&quot;);

trace(test);
</code></pre>
<p>Ausgabe:<br />
3903961984</p>
<p>Hier der Code in c++:</p>
<pre><code class="language-cpp">unsigned int i = (int) 633876643524492195;
TRACE(&quot;i is %u\r\n&quot;,i);
</code></pre>
<p>Ausgabe:<br />
3903962019</p>
<p>Ich will in c++ auf den gleichen Wert kommen wie in Flash.<br />
Ich freue mich über jede Hilfe!</p>
<p>Michael</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1772719</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1772719</guid><dc:creator><![CDATA[Hecker.Michael]]></dc:creator><pubDate>Sat, 05 Sep 2009 12:53:32 GMT</pubDate></item><item><title><![CDATA[Reply to 32-bit unsigned int Typecast on Sat, 05 Sep 2009 12:58:50 GMT]]></title><description><![CDATA[<p>Die Zahl ist zu gross für den <code>int</code> , da werden Bits abgeschnitten. Du könntest es mit <code>long long int</code> versuchen, wenn dein Compiler das unterstützt - der Typ ist allerdings nicht im C++-Standard. Ansonsten kannst du zu einer externen Bibliothek greifen oder dir selbst was basteln.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1772726</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1772726</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Sat, 05 Sep 2009 12:58:50 GMT</pubDate></item><item><title><![CDATA[Reply to 32-bit unsigned int Typecast on Sat, 05 Sep 2009 13:02:07 GMT]]></title><description><![CDATA[<p>Das ist schon richtig so. Den Code in Flash habe ich aus einer Anwendung, die ich nun nach c++ portieren will. Die Frage ist nun wie ich das gleiche Abschneide-Verhalten in c++ realisiere. Mich wundert außerdem, dass das Ergebnis gar nicht &quot;Teilmenge&quot; der ursprünglichen Zahl ist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1772732</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1772732</guid><dc:creator><![CDATA[Hecker.Michael]]></dc:creator><pubDate>Sat, 05 Sep 2009 13:02:07 GMT</pubDate></item><item><title><![CDATA[Reply to 32-bit unsigned int Typecast on Sat, 05 Sep 2009 13:10:24 GMT]]></title><description><![CDATA[<p>Es werden wie gesagt Bits, nicht Dezimalstellen abgeschnitten. Dadurch kann eine völlig andere Zahl herauskommen.</p>
<p>Am einfachsten ist es wohl, die Zahl als String ( <code>std::string</code> ) zu speichern, dann kannst du führende Elemente entfernen.</p>
<pre><code class="language-cpp">std::string num_str = &quot;12345678901234567890&quot;;
num_str.erase(0, anzahl_zu_loeschender_stellen);
</code></pre>
<p>Für die Umwandlung zu <code>int</code> hilft dir <code>std::stringstream</code> im Header <code>&lt;sstream&gt;</code> :</p>
<pre><code class="language-cpp">int integer;
std::stringstream stream(num_str);
num_str &gt;&gt; integer;
</code></pre>
<p>Siehe auch <a href="http://www.cplusplus.com" rel="nofollow">www.cplusplus.com</a>.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1772736</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1772736</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Sat, 05 Sep 2009 13:10:24 GMT</pubDate></item><item><title><![CDATA[Reply to 32-bit unsigned int Typecast on Sat, 05 Sep 2009 14:00:05 GMT]]></title><description><![CDATA[<p>Zunächst einmal garantiert der C++ Standard hier kein bestimmtes Ergebnis. Das liegt daran, dass er nicht vorschreibt, was &quot;unsigned int&quot; und &quot;int&quot; genau ist, oder ob 64Bit-Werte überhaupt unterstützt werden.</p>
<pre><code>Dezimal: 633876643524492195
Hex:        8CBFB72E8B1BBA3

Dezimal:         3903962019  (&quot;C++&quot;)
Hex:               E8B1BBA3

Dezimal:         3903961984  (&quot;Flash&quot;)
Hex:               E8B1BB80
                         ~~
</code></pre>
<p>Beobachtungen:</p>
<p>Die Zahl 633876643524492195 ist nicht mit 32 Bit darstellbar.</p>
<p>Offensichtlich benutzt Dein C++ Compiler 32-Bit ints. (Das ist keine Seltenheit aber auch nicht selbstverständlich!)</p>
<p>Wahrscheinlich konvertiert Flash die Zahl zu einer 32Bit Fließkommazahl (mit 24Bit-Mantisse) und anschließend zu einem Int. Dabei geht die Genauigkeit verloren. Wie man sieht, sind die letzten beiden Hex-Stellen unterschiedlich.</p>
<p>Dein C++ Compiler unterstützt wahrscheinlich 64Bit-Konstanten. In der C++ Version ist keine Genauigkeit verloren gegangen.</p>
<p>Siehe auch <a href="http://home.att.net/~jackklein/c/inttypes.html" rel="nofollow">hier</a>.</p>
<blockquote>
<p>Ich will in c++ auf den gleichen Wert kommen wie in Flash.<br />
Ich freue mich über jede Hilfe!</p>
</blockquote>
<p>Dann setze doch gleich die &quot;richtige&quot; Zahl ein.</p>
<p>Ich kann die Ergebnisse nicht reproduzieren.</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;

int main()
{
  unsigned int z = 633876643524492195;
  std::cout &lt;&lt; z &lt;&lt; '\n';
}
</code></pre>
<p>liefert bei mir, mit dem G++ 4.4.1 kompiliert, die Zahl 4294967295 = 0xFFFFFFFF. Und eine Warnung bekomme ich auch dazu:</p>
<pre><code>Warnung: Große Ganzzahl implizit auf vorzeichenlosen Typen abgeschnitten
</code></pre>
<p>Was ist passiert? Dem Compiler war die Konstante zu groß. Da ich im C++03-Modus kompiliert habe und <code>long</code> nicht groß genug für die Konstante ist, wurde die Konstante einfach durch 0xFFFFFFFF ersetzt. Wenn ich von der C99-Erweiterung &quot;long long&quot; gebrauch mache:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;

int main()
{
  unsigned int z = 633876643524492195LL; // man achte auf den LL Suffix
  std::cout &lt;&lt; z &lt;&lt; '\n';
}
</code></pre>
<p>erhalte ich 3903962019 wie erwartet bei 32bit unsigned ints.</p>
<p>Gruß,<br />
SP</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1772749</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1772749</guid><dc:creator><![CDATA[Sebastian Pizer]]></dc:creator><pubDate>Sat, 05 Sep 2009 14:00:05 GMT</pubDate></item><item><title><![CDATA[Reply to 32-bit unsigned int Typecast on Sat, 05 Sep 2009 14:22:12 GMT]]></title><description><![CDATA[<p>Hi, vielen Dank für die ausführliche Antwort aber die Lösung ist das noch nicht, zumindest sehe ich sie nicht.</p>
<p>Zum Hintergrund:<br />
Ein Flash-App kommuniziert mit einem Server. In jeder Antwort sendet der Server einen check-Value (z.B.: 633876643524492195), der im Applet in ein uint konvertiert und dann beim nächsten request wieder mitgesendet wird.</p>
<p>Ich will die Kommunikation mit dem Server nun über eine c++ Anwendung realisieren also muss ich auch den Punkt mit der uint-konvertierung nachbilden.</p>
<p>Ist aus deinem Post zu lesen, dass das gar nicht möglich sein soll?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1772775</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1772775</guid><dc:creator><![CDATA[Hecker.Michael]]></dc:creator><pubDate>Sat, 05 Sep 2009 14:22:12 GMT</pubDate></item><item><title><![CDATA[Reply to 32-bit unsigned int Typecast on Sat, 05 Sep 2009 14:57:59 GMT]]></title><description><![CDATA[<p>Hecker.Michael schrieb:</p>
<blockquote>
<p>Hi, vielen Dank für die ausführliche Antwort aber die Lösung ist das noch nicht, zumindest sehe ich sie nicht.</p>
</blockquote>
<p>Eigentlich hat Sebastian dir das Problem bereits erklärt. Du musst deine lange Zahl zuerst in ein double quetschen, danach erst in ein int bzw. sicherheitshalber in ein __int32. Das scheint nämlich in der Actionscript-Variante zu passieren.</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
using namespace std;

int main(void)
{
    unsigned __int32 i;
    __int64 i64 = 633876643524492195;

    double d = i64;
    i = d;

    cout &lt;&lt; i &lt;&lt; endl;
    return 0;
}
</code></pre>
<p>Der Standard bleibt natürlich auf der Strecke.</p>
<p>Welchen Datentyp hat denn dieses &quot;check-Value&quot; auf der Serverseite?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1772784</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1772784</guid><dc:creator><![CDATA[Mitleid]]></dc:creator><pubDate>Sat, 05 Sep 2009 14:57:59 GMT</pubDate></item><item><title><![CDATA[Reply to 32-bit unsigned int Typecast on Sat, 05 Sep 2009 15:21:57 GMT]]></title><description><![CDATA[<p>Das Problem ist, dass Du nicht genau weißt, was &quot;Flash&quot; da macht, und dass ohne Wissen darüber ein Protokoll &quot;definiert&quot; worden ist. Solltest Du die Möglichkeit haben, das Protokoll zu ändern, würde ich Dir empfehlen, das zu tun. Alles andere ist Pfusch. Wirklich! Wenn Du etwas in C++ schreiben willst, was genau das macht, was Flash macht, musst Du zunächst rauskriegen, was da genau passiert. Das von mir ist ja nur eine Vermutung.</p>
<p>Du kannst es ja als Notlösung über Konvertierung nach double probieren:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;sstream&gt;
#include &lt;string&gt;

int main()
{
	std::string zahl = &quot;633876643524492195&quot;;
	std::stringstream ss (zahl);
	double x;
	ss &gt;&gt; x;
	unsigned u = x;
	std::cout &lt;&lt; u &lt;&lt; '\n';
}
</code></pre>
<p>Es liefert bei mir die Ausgabe:</p>
<pre><code>3903961984
</code></pre>
<p>Das ist aber -- wie gesagt -- implementierungsabhängig. Du solltest Dir schleunigst das verinnerlichen, was auf der Seite steht, die ich zum Thema C/C++ Datentypen verlinkt habe. Am besten baust Du mindestens noch etwas wie</p>
<pre><code class="language-cpp">#include &lt;climits&gt;

//...

#if   UINT_MAX  == 4294967295
typedef unsigned int   u32_t;
#elif USHRT_MAX == 4294967295
typedef unsigned short u32_t;
#elif ULONG_MAX == 4294967295
typedef unsigned long  u32_t;
#else
#error &quot;Mich kannst Du so nicht kompilieren. Ich brauche 32-Bit Zahlen.&quot;
#endif
</code></pre>
<p>in eine Header-Datei ein und benutzt dann &quot;u32_t&quot; statt &quot;unsigned int&quot;.</p>
<p>Gruß,<br />
SP</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1772789</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1772789</guid><dc:creator><![CDATA[Sebastian Pizer]]></dc:creator><pubDate>Sat, 05 Sep 2009 15:21:57 GMT</pubDate></item><item><title><![CDATA[Reply to 32-bit unsigned int Typecast on Sat, 05 Sep 2009 15:21:28 GMT]]></title><description><![CDATA[<p>Na also! Tausend Dank!<br />
Mir ist schon klar, dass das so nicht das gelbe vom Ei ist aber Zugang zum Server-Code kann ich nicht bekommen und so muss ich damit leben was ich habe.</p>
<p>Ich danke euch!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1772792</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1772792</guid><dc:creator><![CDATA[Hecker.Michael]]></dc:creator><pubDate>Sat, 05 Sep 2009 15:21:28 GMT</pubDate></item><item><title><![CDATA[Reply to 32-bit unsigned int Typecast on Sat, 05 Sep 2009 15:34:44 GMT]]></title><description><![CDATA[<p>Mitleid schrieb:</p>
<blockquote>
<p>Das scheint nämlich in der Actionscript-Variante zu passieren.</p>
</blockquote>
<p>Ja, so ist es. Sogar explizit:</p>
<pre><code>var test:uint;
test = Number(&quot;633876643524492195&quot;);
</code></pre>
<p>Number ist in AS3 quasi double. Schon ein komisches Konstrukt, das. Man könnte auch direkt in uint konvertieren.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1772799</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1772799</guid><dc:creator><![CDATA[Registrierter Troll]]></dc:creator><pubDate>Sat, 05 Sep 2009 15:34:44 GMT</pubDate></item></channel></rss>