0Pricing
C++ Academy · Lezione

Limiti numerici e comportamento dell'overflow

Interroghi std::numeric_limits e comprenda le regole dell'overflow con segno e senza segno

Limiti numerici e comportamento dell'overflow è una lezione C++ Academy gratuita su CoddyKit. Questa è la lezione 4 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento C++ Academy, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso C++ Academy include 4 lezioni in totale.

Perché i limiti sono importanti

Ogni tipo numerico ha un valore massimo e minimo rappresentabile. Superarli può produrre silenziosamente risultati errati o persino comportamenti indefiniti.

std::numeric_limits

Consulti i limiti di qualsiasi tipo numerico con l'header <limits>. Sono costanti valutate a compile time, senza costi a runtime.

#include <limits>
std::cout << std::numeric_limits<int>::max() << "\n";
std::cout << std::numeric_limits<int>::min() << "\n";
std::cout << std::numeric_limits<double>::epsilon();

Query comuni

I membri più utili:

  • max() — valore massimo
  • min() — valore minimo (positivo)
  • lowest() — valore più negativo
  • epsilon() — differenza minima significativa (per i numeri in virgola mobile)
  • digits10 — cifre decimali garantite

Overflow degli interi con segno

L'overflow degli interi con segno è un comportamento indefinito. Il compilatore può presumere che non si verifichi mai, producendo ottimizzazioni sorprendenti.

int x = std::numeric_limits<int>::max();
x += 1;   // UB — anything can happen

Wraparound degli interi senza segno

L'overflow degli interi senza segno è definito: i valori ricominciano da zero secondo il modulo 2^N. A volte è utile, ma spesso è una fonte di bug.

unsigned int u = 0;
u -= 1;   // wraps to 4,294,967,295 (UINT_MAX)

Overflow e underflow dei float

I float vanno in overflow fino a inf invece di causare un arresto anomalo. L'underflow produce numeri subnormali oppure 0.

double x = 1e308;
x *= 100;
std::cout << x;  // inf

Rilevare l'overflow in sicurezza

Per gli interi con segno, controlli prima di eseguire l'operazione. I compilatori offrono funzioni integrate per l'aritmetica verificata, come __builtin_add_overflow in GCC/Clang.

if (a > std::numeric_limits<int>::max() - b) {
    // overflow would happen
}
int sum = a + b;

std::ssize e std::cmp_less in C++20

C++20 aggiunge funzioni sicure per confrontare interi in <utility>: std::cmp_equal, cmp_less, cmp_greater. Gestiscono correttamente la combinazione di valori con e senza segno.

Le conversioni implicite sono insidiose

Mescolare valori con e senza segno in un confronto converte silenziosamente l'operando con segno in un valore senza segno: una causa comune di bug sottili.

int a = -1;
unsigned int b = 1;
if (a < b) std::cout << "yes";
else       std::cout << "no";   // prints "no"!

Controlli a compile time

Usi static_assert per verificare le assunzioni sulle dimensioni quando scrive codice portabile.

static_assert(sizeof(int) >= 4, "Need at least 32-bit int");

I sanitizer aiutano nei test

Compili con -fsanitize=undefined per rilevare l'overflow con segno a runtime durante i test.

g++ -fsanitize=undefined -O1 main.cpp

Verifica rapida

Che cosa succede quando un'addizione di interi con segno va in overflow in C++?

Riepilogo

Usi std::numeric_limits per consultare i limiti dei tipi. L'overflow con segno è indefinito, mentre quello senza segno ricomincia da zero. Faccia attenzione quando mescola valori con e senza segno. I sanitizer e i confronti sicuri di C++20 aiutano a proteggere il codice.

Domande Frequenti

La lezione «Limiti numerici e comportamento dell'overflow» è gratuita?

Sì — il testo completo di «Limiti numerici e comportamento dell'overflow» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso C++ Academy, passa a CoddyKit PRO. Il corso C++ Academy include 4 lezioni in totale.

Cosa imparerò in «Limiti numerici e comportamento dell'overflow»?

Interroghi std::numeric_limits e comprenda le regole dell'overflow con segno e senza segno Eserciti C++ Academy con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.

Ho bisogno di esperienza per iniziare C++ Academy?

Non è richiesta alcuna esperienza precedente. C++ Academy su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 4 di 4.

Quanto tempo richiede la lezione «Limiti numerici e comportamento dell'overflow»?

La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.

Posso scrivere ed eseguire codice in questa lezione C++ Academy?

Sì. Ogni lezione C++ Academy include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.

Tutte le lezioni di questo corso

  1. Tipi interi e a virgola mobile a confronto
  2. L'header cmath: pow, sqrt, abs, round
  3. Numeri casuali con l'header random
  4. Limiti numerici e comportamento dell'overflow
← Torna a C++ Academy