<?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[BMPs einlesen]]></title><description><![CDATA[<p>Hallo,</p>
<pre><code>//Converts a four-character array to an integer, using little-endian form
	int toInt(const char* bytes) {
		return (int)(((unsigned char)bytes[3] &lt;&lt; 24) |
					 ((unsigned char)bytes[2] &lt;&lt; 16) |
					 ((unsigned char)bytes[1] &lt;&lt; 8) |
					 (unsigned char)bytes[0]);
	}

	//Reads the next four bytes as an integer, using little-endian form
	int readInt(ifstream &amp;input) {
		char buffer[4];
		input.read(buffer, 4);
		return toInt(buffer);
	}
</code></pre>
<p>Wollte nur mal kurz nachfragen, warum man in der toInt-Funktion noch mal die unsigned char casts braucht bzw. was passiert, wenn man sie weglässt. Unterschiede kanns ja eigentlich nur dann geben, wenn das MSB 1 ist, aber da doch hier sowieso nur Bitmuster verodert und am Ende nach int gecastet werden, müsste man sich den cast doch sparen können oder übersehe ich was?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/319090/bmps-einlesen</link><generator>RSS for Node</generator><lastBuildDate>Sun, 26 Jul 2026 05:16:55 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/319090.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 06 Aug 2013 14:27:20 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to BMPs einlesen on Tue, 06 Aug 2013 14:27:20 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<pre><code>//Converts a four-character array to an integer, using little-endian form
	int toInt(const char* bytes) {
		return (int)(((unsigned char)bytes[3] &lt;&lt; 24) |
					 ((unsigned char)bytes[2] &lt;&lt; 16) |
					 ((unsigned char)bytes[1] &lt;&lt; 8) |
					 (unsigned char)bytes[0]);
	}

	//Reads the next four bytes as an integer, using little-endian form
	int readInt(ifstream &amp;input) {
		char buffer[4];
		input.read(buffer, 4);
		return toInt(buffer);
	}
</code></pre>
<p>Wollte nur mal kurz nachfragen, warum man in der toInt-Funktion noch mal die unsigned char casts braucht bzw. was passiert, wenn man sie weglässt. Unterschiede kanns ja eigentlich nur dann geben, wenn das MSB 1 ist, aber da doch hier sowieso nur Bitmuster verodert und am Ende nach int gecastet werden, müsste man sich den cast doch sparen können oder übersehe ich was?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2343924</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2343924</guid><dc:creator><![CDATA[banshee]]></dc:creator><pubDate>Tue, 06 Aug 2013 14:27:20 GMT</pubDate></item><item><title><![CDATA[Reply to BMPs einlesen on Tue, 06 Aug 2013 14:39:39 GMT]]></title><description><![CDATA[<p>Was hat das mit BMPs zu tun?</p>
<p>Hmm: Probiere es aus. Du kannst dir vorher gern das Bitmuster von -1 bzw. 255 anschauen und die Darstellung in der verschiedenen Typen int/char unsigned/signed.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2343928</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2343928</guid><dc:creator><![CDATA[knivil]]></dc:creator><pubDate>Tue, 06 Aug 2013 14:39:39 GMT</pubDate></item><item><title><![CDATA[Reply to BMPs einlesen on Tue, 06 Aug 2013 15:50:06 GMT]]></title><description><![CDATA[<p>banshee schrieb:</p>
<blockquote>
<p>aber da doch hier sowieso nur Bitmuster verodert und am Ende nach int gecastet werden, müsste man sich den cast doch sparen können oder übersehe ich was?</p>
</blockquote>
<p>Shift von negativen Zahlen ist undefiniert. Auf meiner Plattform wird das Vorzeichen übernommen und der Rest geshiftet, also -1 &lt;&lt; 8 = -256.<br />
Das bitweise zu verodern ist wiederum undefiniert. Es kommt auf jeden Fall nicht das richtige raus.</p>
<p>Der letzte Cast nach int ist übrigens unnötig.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2343959</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2343959</guid><dc:creator><![CDATA[sbump]]></dc:creator><pubDate>Tue, 06 Aug 2013 15:50:06 GMT</pubDate></item><item><title><![CDATA[Reply to BMPs einlesen on Tue, 06 Aug 2013 16:51:43 GMT]]></title><description><![CDATA[<p>sbump schrieb:</p>
<blockquote>
<p>banshee schrieb:</p>
<blockquote>
<p>aber da doch hier sowieso nur Bitmuster verodert und am Ende nach int gecastet werden, müsste man sich den cast doch sparen können oder übersehe ich was?</p>
</blockquote>
<p>Shift von negativen Zahlen ist undefiniert.</p>
</blockquote>
<p>ich glaube da versiehst du dich, shift durch negative zahlen ist undefiniert</p>
<pre><code class="language-cpp">-1&lt;&lt;8
</code></pre>
<p>ist wohl definiert</p>
<pre><code class="language-cpp">1&lt;&lt;-8
</code></pre>
<p>ist undefiniert<br />
in c++ ist &lt;&lt;n aequivalent zu *(1&lt;&lt;n) und &gt;&gt;n zu /(1&gt;&gt;n).</p>
<p>beim shift wird der linke operant implizit zu int bzw unit konvertiert, ein negatives char waere ein negatives int.</p>
<p>ich denke das beispiel ist auch ein wenig verwirrend/suboptimal. eigentlich sollte man dort die ganze zeit mit unsigned char arbeiten.</p>
<p>und eigentlich gehoert der thread in den c++ bereich, da es sich um grundlagen von c++ handelt <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/2343987</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2343987</guid><dc:creator><![CDATA[rapso]]></dc:creator><pubDate>Tue, 06 Aug 2013 16:51:43 GMT</pubDate></item><item><title><![CDATA[Reply to BMPs einlesen on Tue, 06 Aug 2013 16:53:07 GMT]]></title><description><![CDATA[<p>Dieser Thread wurde von Moderator/in <a href="http://www.c-plusplus.net/forum/u5577" rel="nofollow">rapso</a> aus dem Forum <a href="http://www.c-plusplus.net/forum/f7" rel="nofollow">Spiele-/Grafikprogrammierung</a> in das Forum <a href="http://www.c-plusplus.net/forum/f15" rel="nofollow">C++ (auch C++0x und C++11)</a> verschoben.</p>
<p>Im Zweifelsfall bitte auch folgende Hinweise beachten:<br />
<a href="http://www.c-plusplus.net/forum/39405" rel="nofollow">C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?</a></p>
<p><em>Dieses Posting wurde automatisch erzeugt.</em></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2343989</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2343989</guid><dc:creator><![CDATA[C++ Forumbot]]></dc:creator><pubDate>Tue, 06 Aug 2013 16:53:07 GMT</pubDate></item><item><title><![CDATA[Reply to BMPs einlesen on Wed, 07 Aug 2013 08:12:11 GMT]]></title><description><![CDATA[<p>Ich habe damit jetzt etwas rumgespielt und es ist irgendwie seltsam. In einigen Fällen mit gesetztem MSB gibt es Unterschiede, die daher rühren, dass am Ende nach int gecastet wird. Wenn man die bytes da nicht unsigned interpretiert, kommt bei negativen Zahlen logischerweise auch als int eine negative raus.<br />
Ich habe dann einfach mal versucht, nach unsigned int zu casten und da passiert etwas wirklich Merkwürdiges. Wenn ich das char array mit {-1,0,0,0} initialisiere, das Bitmuster von</p>
<pre><code>(bytes[3] &lt;&lt; 24) | (bytes[2] &lt;&lt; 16) | (bytes[1] &lt;&lt; 8) | bytes[0]
</code></pre>
<p>also 000000000 00000000 00000000 11111111 ergibt, dann interpretiert ein cast nach unsigned int das als -1 anstatt 255. Die 0en werden also anscheinend einfach abgeschnitten. Wieso das?</p>
<p>PS: Ja, prinzipiell ist es schon noch reines C++ und ich wollte zuerst auch da eröffnen, aber es ging in erster Linie ums BMP-Laden, wo dieser Code herkommt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2344111</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2344111</guid><dc:creator><![CDATA[banshee]]></dc:creator><pubDate>Wed, 07 Aug 2013 08:12:11 GMT</pubDate></item><item><title><![CDATA[Reply to BMPs einlesen on Wed, 07 Aug 2013 08:46:34 GMT]]></title><description><![CDATA[<p>rapso schrieb:</p>
<blockquote>
<p>ich glaube da versiehst du dich, shift durch negative zahlen ist undefiniert</p>
<pre><code class="language-cpp">-1&lt;&lt;8
</code></pre>
<p>ist wohl definiert</p>
<pre><code class="language-cpp">1&lt;&lt;-8
</code></pre>
<p>ist undefiniert<br />
in c++ ist &lt;&lt;n aequivalent zu *(1&lt;&lt;n) und &gt;&gt;n zu /(1&gt;&gt;n).</p>
</blockquote>
<p>Nein, ich habe das richtig formuliert:</p>
<blockquote>
<p>The value of <code>E1 &lt;&lt; E2</code> is <code>E1</code> left-shifted <code>E2</code> bit positions; vacated bits are zero-filled. If <code>E1</code> has an unsigned type, the value of the result is <code>E1</code> × 2<sup>E2</sup>, reduced modulo one more than the maximum value representable in the result type. Otherwise, <strong>if <code>E1</code> has a signed type</strong> and non-negative value, and <code>E1</code> × 2<sup>E2</sup> is representable in the result type, then that is the resulting value; otherwise, <strong>the behavior is undefined.</strong></p>
</blockquote>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/13497">@banshee</a>: Dein letztes Beispiel ist <code>0 | 0 | 0 | -1</code> , was halt in deiner Plattform -1 ergibt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2344118</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2344118</guid><dc:creator><![CDATA[sbump]]></dc:creator><pubDate>Wed, 07 Aug 2013 08:46:34 GMT</pubDate></item><item><title><![CDATA[Reply to BMPs einlesen on Wed, 07 Aug 2013 20:42:27 GMT]]></title><description><![CDATA[<p>sbump schrieb:</p>
<blockquote>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/13497">@banshee</a>: Dein letztes Beispiel ist <code>0 | 0 | 0 | -1</code> , was halt in deiner Plattform -1 ergibt.</p>
</blockquote>
<p>Aber warum ist das so? Das heißt ja, dass das MSB aka. der Negativschalter auf Position 25 steckt (also MSB des 4. Bytes). Warum werden die drei Bytes vorher einfach verworfen bzw. nicht zur Interpretation der Zahl herangezogen? Was ergibt dann z.B. 1 0 0 -1?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2344320</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2344320</guid><dc:creator><![CDATA[banshee]]></dc:creator><pubDate>Wed, 07 Aug 2013 20:42:27 GMT</pubDate></item></channel></rss>