C Academy · leksjon

Konverteringsfallgruver

Overflow og trunkering

Leksjon 4 av 413 trinn

Konverteringsfallgruver er en gratis leksjon i C Academy på CoddyKit. Dette er leksjon 4 av 4. Du kan lese hele leksjonen gratis nedenfor – og deretter øve praktisk i nettleseren med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt. Den er en del av læringsløpet i C Academy, og fremdriften din synkroniseres mellom nettet og CoddyKit-appen. Kurset i C Academy inneholder totalt 4 leksjoner.

Konverteringer kan bite

Stille konverteringer er praktiske, men kan føre til overflyt, avkorting og overraskelser med fortegn. Denne leksjonen tar for seg fallgruvene.

#include <stdio.h>
int main(void) {
    printf("Beware silent conversions\n");
    return 0;
}

Heltallsoverflyt

Hvis De tilordner en verdi som er for stor for målheltallstypen, går verdien rundt eller data går tapt.

#include <stdio.h>
#include <limits.h>
int main(void) {
    int max = INT_MAX;
    printf("INT_MAX = %d\n", max);
    return 0;
}

Avkorting ved innsnevring

Når en stor verdi legges i en mindre type, beholdes bare de laveste bitene, og tallet blir stille ødelagt.

#include <stdio.h>
int main(void) {
    int big = 300;
    unsigned char small = (unsigned char)big;
    printf("small = %d\n", small);
    return 0;
}

Blanding av signed og unsigned

Ved blanding av signed og unsigned konverteres signed-verdien til unsigned, slik at negative tall blir svært store positive tall.

#include <stdio.h>
int main(void) {
    int a = -1;
    unsigned int b = 1;
    if (a > b)
        printf("surprise: -1 > 1 as unsigned\n");
    return 0;
}

Fallgruve med løkketeller

En unsigned-løkketeller som går under null, går rundt til en svært stor verdi og fører til en uendelig løkke. Bruk signed-tellere når De teller nedover.

#include <stdio.h>
int main(void) {
    for (int i = 3; i >= 0; i--)
        printf("%d ", i);
    printf("\n");
    return 0;
}

Tap ved konvertering fra float til int

Konvertering fra float til int fjerner brøkdelen. Hvis verdien overskrider området for int, er resultatet udefinert.

#include <stdio.h>
int main(void) {
    double d = 3.99;
    int n = (int)d;
    printf("n = %d\n", n);
    return 0;
}

Presisjonstap fra double til float

Når en double med høy presisjon lagres i en float, forsvinner sifre. Dette kan hope seg opp i lange beregninger.

#include <stdio.h>
int main(void) {
    double d = 1.123456789012345;
    float f = (float)d;
    printf("%.7f\n", f);
    return 0;
}

Overraskelser med char-fortegn

Hvorvidt char har fortegn, er implementasjonsdefinert. Bruk unsigned char for byteverdier for å unngå negative resultater.

#include <stdio.h>
int main(void) {
    unsigned char b = 200;
    printf("b = %d\n", b);
    return 0;
}

Dividere før konvertering

Hvis De utfører heltallsdivisjon og deretter caster, kan den tapte brøkdelen ikke gjenopprettes. Cast før divisjonen.

#include <stdio.h>
int main(void) {
    int a = 7, b = 2;
    double wrong = (double)(a / b);
    double right = (double)a / b;
    printf("%.1f vs %.1f\n", wrong, right);
    return 0;
}

Sammenligne størrelser

Bruk konstantene i limits.h for å forstå hvilket område en type kan inneholde, før De antar at en verdi får plass.

#include <stdio.h>
#include <limits.h>
int main(void) {
    printf("char range: %d to %d\n", CHAR_MIN, CHAR_MAX);
    return 0;
}

Defensive konverteringer

Kontroller områdene før De snevrer inn typen, foretrekk bredere typer når De er i tvil, og gjør caster eksplisitte slik at hensikten er tydelig.

#include <stdio.h>
int main(void) {
    long value = 200;
    if (value >= 0 && value <= 255)
        printf("fits in a byte: %ld\n", value);
    return 0;
}

Hurtigsjekk

Test forståelsen Deres av fallgruver ved konvertering.

Oppsummering: Fallgruver ved konvertering

De har lært om farene ved stille konverteringer.

  • Innsnevring kan føre til overflyt eller avkorting
  • Blanding av signed og unsigned snur sammenligninger
  • unsigned-tellere går rundt under null
  • Cast før divisjon for å beholde brøkdeler
  • Kontroller områder og gjør caster eksplisitte
Gratis å komme i gang

Lær deg C med en AI-veileder – gratis

Skriv og kjør ekte kode i nettleseren, få umiddelbar hjelp fra en AI-veileder som er tilgjengelig døgnet rundt, og fortsett der du slapp – på nettet eller i appen.

Kurs
39
Leksjoner
144

Ofte stilte spørsmål

Er leksjonen «Konverteringsfallgruver» gratis?

Ja – hele teksten i «Konverteringsfallgruver» er gratis å lese her på nettet. For å øve interaktivt med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt, og for å låse opp resten av C Academy-kurset, kan du oppgradere til CoddyKit PRO. Kurset i C Academy inneholder totalt 4 leksjoner.

Hva lærer jeg i «Konverteringsfallgruver»?

Overflow og trunkering Du øver på C Academy med praktisk kode som du kjører direkte i nettleseren, mens en AI-veileder som er tilgjengelig døgnet rundt, svarer på spørsmålene dine mens du jobber deg gjennom leksjonen.

Trenger jeg erfaring for å begynne med C Academy?

Ingen tidligere erfaring er nødvendig. C Academy på CoddyKit er lagt opp for både nybegynnere og viderekomne, så De kan begynne her eller helt fra start og lære i Deres eget tempo. Dette er leksjon 4 av 4.

Hvor lang tid tar leksjonen «Konverteringsfallgruver»?

De fleste CoddyKit-leksjoner tar omtrent 5–10 minutter. Hver leksjon er kort og interaktiv, slik at De gjør jevne fremskritt og kan fortsette akkurat der De slapp – både på nettet og i appen.

Kan jeg skrive og kjøre kode i denne C Academy-leksjonen?

Ja. Alle C Academy-leksjoner har en innebygd kodeeditor, slik at De kan skrive og kjøre ekte kode direkte i nettleseren og få umiddelbar tilbakemelding fra AI – uten lokal konfigurering.

Alle leksjonene i dette kurset

  1. Implisitte konverteringer
  2. Eksplisitte casts
  3. Konvertering mellom heltall og flyttall
  4. Konverteringsfallgruver
← Tilbake til C Academy