C++ Academy · Lektion

Numeriska gränser och overflow-beteende

Fråga efter std::numeric_limits och förstå reglerna för overflow i signed och unsigned typer

Lektion 4 av 413 steg

Numeriska gränser och overflow-beteende är en gratis lektion i C++ Academy på CoddyKit. Detta är lektion 4 av 4. Du kan läsa vilka 3 lektioner som helst i den här lärvägen kostnadsfritt i sin helhet – därefter låser CoddyKit PRO upp alla lektioner, plus praktisk övning med en inbyggd kodredigerare och en AI-lärare dygnet runt. Den ingår i lärvägen för C++ Academy, och Era framsteg synkroniseras mellan webben och CoddyKit-appen. Kursen i C++ Academy innehåller totalt 4 lektioner.

Varför gränser är viktiga

Varje numerisk typ har ett största och minsta representerbart värde. Om dessa överskrids kan resultatet bli fel utan någon varning — eller leda till odefinierat beteende.

std::numeric_limits

Hämta gränserna för valfri numerisk typ med headern <limits>. Det är konstanter vid kompilering och medför ingen kostnad vid körning.

#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();

Vanliga anrop

De mest användbara medlemmarna:

  • max() — största värdet
  • min() — minsta (positiva) värdet
  • lowest() — mest negativa värdet
  • epsilon() — minsta meningsfulla skillnad (för flyttal)
  • digits10 — garanterat antal decimaler

Överflöde för signed heltal

Överflöde för heltal med tecken är odefinierat beteende. Kompilatorn kan anta att det aldrig inträffar, vilket kan leda till överraskande optimeringar.

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

Överflöde för unsigned heltal

Överflöde för heltal utan tecken är definierat — värdena slår runt modulo 2^N. Det kan ibland vara användbart men leder ofta till svårupptäckta fel.

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

Överflöde och underflöde för flyttal

Flyttalstyper får värdet inf vid överflöde i stället för att programmet kraschar. Underflöde leder till subnormala tal eller 0.

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

Upptäcka överflöde säkert

För heltal med tecken bör ni kontrollera värdet före operationen. Kompilatorer tillhandahåller inbyggda hjälpmedel för kontrollerad aritmetik, som __builtin_add_overflow i GCC/Clang.

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

C++20 std::ssize och std::cmp_less

C++20 lade till säkra hjälpmedel för heltalsjämförelser i <utility>: std::cmp_equal, cmp_less, cmp_greater. De hanterar blandningar av signed och unsigned korrekt.

Implicit konvertering är lömsk

Om signed och unsigned blandas i en jämförelse konverteras det signed-operandet tyst till unsigned — en vanlig källa till subtila fel.

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

Kontroller vid kompilering

Använd static_assert för att säkerställa antaganden om storlek när ni skriver portabel kod.

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

Sanitizers hjälper vid testning

Bygg med -fsanitize=undefined för att upptäcka överflöde för heltal med tecken vid körning under testning.

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

Snabbkontroll

Vad händer när en addition av signed heltal får överflöde i C++?

Sammanfattning

Använd std::numeric_limits för att hämta typgränser. Överflöde för signed är odefinierat; unsigned slår runt. Var försiktig när signed och unsigned blandas. Sanitizers och C++20:s säkra jämförelser hjälper till att skydda koden.

Gratis att börja

Lär dig C++ med en AI-lärare – gratis

Skriv och kör riktig kod i webbläsaren, få omedelbar hjälp av en AI-lärare dygnet runt och fortsätt där du slutade – på webben eller i appen.

Kurser
51
Lektioner
203

Vanliga frågor

Är lektionen ”Numeriska gränser och overflow-beteende” gratis?

Ja – du kan läsa vilka 3 lektioner som helst i lärvägen C++ Academy, inklusive ”Numeriska gränser och overflow-beteende”, kostnadsfritt i sin helhet här på webben. Därefter låser CoddyKit PRO upp alla lektioner, plus interaktiv övning med en inbyggd kodredigerare och en AI-lärare dygnet runt. Kursen i C++ Academy innehåller totalt 4 lektioner.

Vad lär jag mig i ”Numeriska gränser och overflow-beteende”?

Fråga efter std::numeric_limits och förstå reglerna för overflow i signed och unsigned typer Ni övar på C++ Academy med praktisk kod som körs direkt i webbläsaren, medan en AI-handledare som är tillgänglig dygnet runt svarar på Era frågor under lektionen.

Behöver jag någon erfarenhet för att börja lära mig C++ Academy?

Du behöver inga förkunskaper. Utbildningen i C++ Academy på CoddyKit är upplagd för allt från nybörjare till avancerade elever, så att du kan börja här eller från början och gå fram i din egen takt. Detta är lektion 4 av 4.

Hur lång tid tar lektionen ”Numeriska gränser och overflow-beteende”?

De flesta CoddyKit-lektioner tar cirka 5–10 minuter. Varje lektion är kort och interaktiv, så att du gör stadiga framsteg och kan fortsätta precis där du slutade – på webben eller i appen.

Kan jag skriva och köra kod i den här C++ Academy-lektionen?

Ja. Varje C++ Academy-lektion innehåller en inbyggd kodredigerare, så att du kan skriva och köra riktig kod direkt i webbläsaren och få omedelbar AI-feedback – utan lokal installation.

Alla lektioner i den här kursen

  1. Heltalstyper jämfört med flyttalstyper
  2. Headern cmath: pow, sqrt, abs, round
  3. Slumptal med headern random
  4. Numeriska gränser och overflow-beteende
← Tillbaka till C++ Academy