Sto tentando esercizio 2.1 di K & R.Come determinare a livello intero numero intero/min in C?
L'esercizio è così formulato:
Scrivi un programma per determinare gli intervalli di char, short, int, e le variabili lunghi, entrambi firmati e non firmati , stampando i valori appropriati dalle intestazioni standard e mediante calcolo diretto. Più difficile se li calcolhi: determina gli intervalli dei vari tipi a virgola mobile.
Stampa dei valori delle costanti nelle intestazioni standard è semplice, proprio come questo (solo numeri interi mostrato per esempio):
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);
Tuttavia, voglio per determinare i limiti di programmazione.
Ho provato questo codice che sembra che dovrebbe funzionare, ma in realtà va in un ciclo infinito e si blocca lì:
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);
Perché questo conficcato in un ciclo? Sembrerebbe che quando un intero trabocca salta da 2147483647 a -2147483648. Il valore incrementato è ovviamente più piccolo del valore precedente, quindi il ciclo dovrebbe terminare, ma non lo è.
Questo funziona bene sul mio sistema. Immagino che il ciclo non si sia bloccato, ci è voluto molto tempo perché int_max nel tuo sistema è troppo grande. – Mureinik
Aha! Hai ragione! Immagino che 2.147.483.647 incrementi siano sufficienti per completare alcuni cicli. –
Se si blocca in un loop infinito (controllare l'assemblaggio per essere sicuri). Il compilatore può ottimizzare '(i_max + 1)> i_max' su true poiché l'overflow con segno non è definito. – FDinoff