Rolf B: c Mathematik über Binary

Beitrag lesen

Hallo pl,

Und %d nehme ich wenn ich zusätzlich zu einem integer das Vorzeichen sehen will. Wenn ich alles mit %u ausgebe, sehe ich ja das Vorzeichen nicht.

Nein! Es sind nicht nur Formate für die Ausgabe. Es sind auch Definitionen, was das Bitmuster bedeutet, das Du bei der Parameterübergabe an printf() auf den Stack geschoben hast. Wie schon geschrieben: Die printf() Funktion sieht nur das Bitmuster. Sie weiß von sich aus nichts darüber, aus welchem Variablentyp Du das geholt hast. Sie weiß auch nicht, wie viele Parameter Du mitgegeben hast. Das musst Du alles über den Formatstring mitteilen. Und vor allem korrekt mitteilen.

Ob die im folgenden genannten "32" Bit richtig sind, hängt vom Compiler ab. Sieh sie als Platzhalter für "sizeof(int)".

Du nimmst %d, wenn Du 32 Bits auf den Stack geschoben hast, die für einen int Wert stehen, also eine Zahl im Bereich INT_MIN bis INT_MAX.

Du nimmst %u, wenn Du 32 Bits auf den Stack geschoben hast, die für einen unsigned int Wert stehen, also eine Zahl im Bereich 0 bis UINT_MAX.

limits.h definiert für ein System mit 32-bit Integers: INT_MIN=-2147483648, INT_MAX=2147483647, UINT_MAX=4294967295u (beachte das u Suffix, das dem Compiler sagt, dass dies ein unsigned-Literal ist).

Die Bitmuster, die in einem unsigned int für die Werte (INT_MAX+1) bis UINT_MAX stehen, stehen in einem signed int für die Werte INT_MIN bis -1. Die bekannte Zweierkomplement-Darstellung negativer Zahlen. Deswegen werden hohe uint-Werte negativ ausgegeben, wenn Du %d statt %u verwendest.

Rolf

--
sumpsi - posui - clusi