<?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[4 chars in einen float umwandeln]]></title><description><![CDATA[<p>Hallo, ich bekomme Daten aus einem Speichergerät in einem char Array. Und nun muss ich eben aus 4 der &quot;Bytes&quot; einen float-Wert auslesen. Dummerweise haben mich meine Versuche jetzt vollkommen verwirrt - wie es mir immer geht, wenn ich zu viel rumreferenzieren will. Meine letzte Lösung sieht so aus:</p>
<pre><code class="language-cpp">float Blah(char* Array)
    {
        char Temp[4];
        for(int a = 3; a &gt;= 0; a--)
            Temp[a] = Array[a];
        float *fltTmp;
        fltTmp = (float*)Temp;
        return *fltTmp;
    }
</code></pre>
<p>Fällt hier jemandem auf, was falsch ist? (Abgesehen vom Ergebnis, das am Ende nie gestimmt hat)</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/133458/4-chars-in-einen-float-umwandeln</link><generator>RSS for Node</generator><lastBuildDate>Thu, 27 Aug 2026 22:57:09 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/133458.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 18 Jan 2006 06:56:07 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to 4 chars in einen float umwandeln on Wed, 18 Jan 2006 06:56:45 GMT]]></title><description><![CDATA[<p>Hallo, ich bekomme Daten aus einem Speichergerät in einem char Array. Und nun muss ich eben aus 4 der &quot;Bytes&quot; einen float-Wert auslesen. Dummerweise haben mich meine Versuche jetzt vollkommen verwirrt - wie es mir immer geht, wenn ich zu viel rumreferenzieren will. Meine letzte Lösung sieht so aus:</p>
<pre><code class="language-cpp">float Blah(char* Array)
    {
        char Temp[4];
        for(int a = 3; a &gt;= 0; a--)
            Temp[a] = Array[a];
        float *fltTmp;
        fltTmp = (float*)Temp;
        return *fltTmp;
    }
</code></pre>
<p>Fällt hier jemandem auf, was falsch ist? (Abgesehen vom Ergebnis, das am Ende nie gestimmt hat)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/969428</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/969428</guid><dc:creator><![CDATA[HEZ]]></dc:creator><pubDate>Wed, 18 Jan 2006 06:56:45 GMT</pubDate></item><item><title><![CDATA[Reply to 4 chars in einen float umwandeln on Wed, 18 Jan 2006 07:11:50 GMT]]></title><description><![CDATA[<p>Was auf jeden Fall nicht stimmen muss, ist das Alignment. Das könnte sich z.B. in einem Bus Error äußern.</p>
<p>Versuch es mal so:</p>
<pre><code class="language-cpp">float Blah(char* Array)
    {
        float result;
        memmove( &amp;result, Array, sizeof(float));
        return result;
    }
</code></pre>
<p>Wie der Floatwert des Geräts aufgebaut ist und wie der deines Computers aufgebaut ist, ist noch eine ganz andere Sache. Sofern sie beide IEEE-konform sind, hast du &quot;nur&quot; noch ein potenzielles Byte-Ordering-Problem.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/969436</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/969436</guid><dc:creator><![CDATA[7H3 N4C3R]]></dc:creator><pubDate>Wed, 18 Jan 2006 07:11:50 GMT</pubDate></item><item><title><![CDATA[Reply to 4 chars in einen float umwandeln on Wed, 18 Jan 2006 07:08:06 GMT]]></title><description><![CDATA[<p>Die interne Darstellung von float's ist afaik compiler-abhängig - das heißt, du kannst auf diese Weise nur float-Zahlen rekonstruieren, die du mit der umgekehrten Methode (char* cTemp=(char*)&amp;flVal;) unter den selben Bedingungen gebildet hast.</p>
<p>(und btw ist nicht einmal sicher, daß sizeof(float)==4 gilt)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/969437</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/969437</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Wed, 18 Jan 2006 07:08:06 GMT</pubDate></item><item><title><![CDATA[Reply to 4 chars in einen float umwandeln on Wed, 18 Jan 2006 07:32:40 GMT]]></title><description><![CDATA[<p>Alignment... Bus Error... Byte-Ordering-Problem... <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /></p>
<p>Nun, wie auch immer: Wenn ich vorher die Reihenfolge der 4 Bytes umdrehe, funktioniert die Methode mit memmove wunderbar.</p>
<p>Die floats werden auch in diesem Format in den Speicher geschrieben, aber die entsprechende Stelle wurde so komplex eingebaut und angepasst, dass ich damit nichts mehr anfangen konnte. Also ist PC, Gerät, Compiler derselbe.</p>
<p>Eine Portierung des Projekts auf einen anderen Compiler ist wahrscheinlich ohnehin nicht sehr ... erfolgsversprechend. <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>Dankeschön!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/969449</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/969449</guid><dc:creator><![CDATA[HEZ]]></dc:creator><pubDate>Wed, 18 Jan 2006 07:32:40 GMT</pubDate></item><item><title><![CDATA[Reply to 4 chars in einen float umwandeln on Wed, 18 Jan 2006 07:53:44 GMT]]></title><description><![CDATA[<p>HEZ schrieb:</p>
<blockquote>
<p>Alignment... Bus Error... Byte-Ordering-Problem... <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /></p>
</blockquote>
<p>Alignment-Probleme bekommst du immer dann, wenn du einen Datentyp in einen anderen umwandelst, indem du einfach eine irgendeine Speicheradresse dafür dereferenzierst. Beispielsweise können Prozessoren an Datentypen wie float die Anforderung haben, dass sie nur an 4 oder 8-Byte-Grenzen ausgerichtet sind. Ein char[4]-Array ist zwar vermutlich noch an einer 4-Byte-Grenze ausgerichtet, aber längst nicht zwingend an einer 8-Byte-Grenze. Wenn man dem Compiler nun einfach sagt &quot;interpretier diese Adresse mal als einen float&quot;, so wird dieser das gutgläubig dem Prozessor mitteilen. Dieser kann aber feststellen, dass er dafür potenziell mehr als einen Lesezugriff brauch (weil die Adresse nicht &quot;aligned&quot; sein muss) und kann die Anforderung mit einem Bus-Error quittieren.</p>
<p>Wenn wir dagegen vorher einen float anlegen und dann sagen, dass an die Adresse des Floats kopiert werden soll, so ist in jedem Fall sichergestellt, dass diese Adresse für einen float auch &quot;well-aligned&quot; ist und der Zugriff hinterher auf den Wert auch funktioniert.</p>
<p>Byte-Ordering-Probleme bekommst du, wenn du z.B. versuchst, Binärdaten zwischen einer Little- und Big-Endian Maschine hin-und-her zu kopieren. Das MSB und LSB (Most/Least Significant Byte) wären dann jeweils vertauscht und die Binär-Interpretation verkehrt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/969454</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/969454</guid><dc:creator><![CDATA[7H3 N4C3R]]></dc:creator><pubDate>Wed, 18 Jan 2006 07:53:44 GMT</pubDate></item></channel></rss>