Frage im Bereich Informatik zur C-Programmierung?

...komplette Frage anzeigen

3 Antworten

Bei 1.) Das kann ich nicht nachvollziehen

unsigned int a = 4294967295;
printf("%u", a);

und dann spuckt er genau die Zahl aus. Könnte es sein, dass in deinem printf ein "%i" steht? Dann nimmt der Compiler die Zahl als signed int und dann ist das logischerweise ein Überlauf.

http://www.cplusplus.com/reference/cstdio/printf/

Bei 2.) Nehmen wir mal einen signed char, dann muss ich nicht so viele Nullen tippen. Wenn wir die Zahl binär ins Zweierkomplement umwandeln, dann ist der niedrigste negative Wert 1000 0000 = -128 . Der höchste positive Wert ist 0111 1111 = 127. 

Für die anderen Ganzzahltypen gilt das gleiche Prinzip, das kann aber noch von Compiler zu Compiler unterschiedlich sein, der C-Standard trifft keine Aussage darüber, wie viel Speicher für die Datentypen tatsächlich reserviert wird. Laut C-Standard muss beispielsweise ein signed char mindestens im Bereich -127 ... 127 sein.

Wobei es bei C keinen Überlauf bei Umwandlungen signed/unsigned gibt, sondern nur eine Uminterpretation. 0xFFFF.FFFF wird als unsigned int als 4294967295 interpretiert, als signed int (32 Bit) als -1.

1

ah okay danke! Bei 1) hatte ich fälschlicherweise %d genommen.

Aber nochmal eine andere Frage:

Wenn ich beispielsweise int zahl deklariere, dann habe ich ja automatisch mit VZ, oder? Wenn ich da jetzt von 32 Bit ausgehe, fällt ja ein Bit für das VZ weg. Also wäre meine höchste Zahl (2^32-1)-1 und das dann grob durch 2 geteilt, also 1073741824. Allerdings kann das Programm auch noch ((2^32)-1) / 2 als höchsten bzw. niedrigsten Wert darstellen???!!! Im letzten Fall bin ich wieder von 32 Bit ausgegangen (also ohne VZ)....aber es ist ja ohne unsigned...das verstehe ich nicht :)

1
@xy121

Den Unterschied zwischen Einer- und Zweierkomplement solltest du dir nochmal anschauen, also die Umwandlung Dezimal-Dual und umgekehrt bei negativen Zahlen. Einfach durch 2 rechnen führt da zu Ungenauigkeiten. Einfach nur "int" ist signed.

Beim Einerkomplement fällt ein Bit für das Vorzeichen weg, das ist richtig. Das Einerkomplement nimmt man aber nicht, weil dort die Zahl 0000 = +0 ist und und 1000 = -0. Zwischen +0 und -0 besteht kein Unterschied, man hat also zwei Binärcodes für ein und die selbe Zahl und der Zahlenraum ist kleiner.

Beim Zweierkomplement ist das anders. Dort bedeutet (wieder char), dass

0111 1111

= 0 * -128 + 1 * 64 + 1 * 32 + 1 * 16 + 1 * 8 + 1 * 4 + 1 * 2 * 1 * 1 = 127 ist. (Die Binärstellen sind oben fett) Dementsprechend wäre der höchstmögliche Wert einer signed 8 bit-Zahl (2^7 - 1) = 127.

Der größte negative Wert ist

1000 0000

= 1 * -128 + 0 * 64 + 0 * 32 + 0 * 16 + 0 * 8 + 0 * 4 + 0 * 2 * 0 * 1 = -128, also (-1) * 2^7

Bei meinem C-Compiler sind die Grenzen für einen signed int auch tatsächlich -2147483648 bis 2147483647. Also geht der Bereich bei der 32 bit-Zahl mit Vorzeichen ebenso von (-1) * 2^31 bis 2^31 - 1.

0

Wie sieht denn der Formatstring aus?

Was möchtest Du wissen?