Ich versuche Übung 2.1 von K & R.Wie programmiere ich ganzzahlig max/min in C?
Die Übung lautet wie folgt:
Schreiben Sie ein Programm, die Bereiche von char, short, int und long Variablen zu bestimmen, die beide mit und ohne Vorzeichen durch Drucken entsprechender Werte aus Standard-Headern und durch direkte Berechnung. Schwieriger, wenn Sie sie berechnen: Bestimmen Sie die Bereiche der verschiedenen Gleitkommatypen.
die Werte der Konstanten in den Standards Header Drucken ist einfach, genau wie diese (nur ganze Zahl zum Beispiel gezeigt):
printf("Integral Ranges (from constants)\n");
printf("int max: %d\n", INT_MAX);
printf("int min: %d\n", INT_MIN);
printf("unsigned int max: %u\n", UINT_MAX);
Allerdings möchte ich programmatisch die Grenzen bestimmen.
habe ich versucht, diesen Code, wie es sollte funktionieren scheint, aber es geht tatsächlich in eine Endlosschleife und wird dort stecken:
printf("Integral Ranges (determined programmatically)\n");
int i_max = 0;
while ((i_max + 1) > i_max) {
++i_max;
}
printf("int max: %d\n", i_max);
Warum ist dies in einer Schleife stecken zu bleiben? Es scheint, dass, wenn eine Ganzzahl überläuft, sie von 2147483647 zu -2147483648 springt. Der inkrementierte Wert ist offensichtlich kleiner als der vorherige Wert, daher sollte die Schleife enden, tut dies aber nicht.
Dies funktioniert gut auf meinem System. Ich schätze, dass die Schleife nicht hängen blieb, es dauerte nur sehr lange, da int_max in Ihrem System zu groß ist. – Mureinik
Aha! Sie haben Recht! Ich nehme an, dass 2.147.483.647 Inkremente ziemlich viele Zyklen benötigen. –
Wenn es in einer Endlosschleife steckenbleibt (überprüfen Sie die Baugruppe, um sicher zu gehen). Der Compiler darf "(i_max + 1)> i_max" auf "wahr" optimieren, da der vorzeichenbehaftete Überlauf nicht definiert ist. – FDinoff