C Academy · Lektion

Fallgropar vid konvertering

Överspill och trunkering.

Lektion 4 av 413 steg

Fallgropar vid konvertering är en gratis lektion i C Academy på CoddyKit. Detta är lektion 4 av 4. Ni kan läsa hela lektionen gratis nedan och sedan öva praktiskt i webbläsaren med en inbyggd kodredigerare och en AI-handledare som är tillgänglig 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.

Konverteringar kan ställa till problem

Tysta konverteringar är praktiska men kan orsaka spill, trunkering och överraskningar med tecken. Den här lektionen behandlar fallgroparna.

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

Heltalsspill

Om Ni tilldelar ett värde som är för stort för målets heltalstyp går värdet runt eller förlorar data.

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

Trunkering vid förminskning

När ett stort värde lagras i en mindre typ behålls bara de lägsta bitarna, vilket tyst förvanskar talet.

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

Blanda signed och unsigned

Om signed och unsigned blandas konverteras signed-värdet till unsigned, så negativa tal blir enorma positiva tal.

#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;
}

Fallgrop med loopräknare

En unsigned-loopräknare som går under noll går runt till ett enormt värde, vilket orsakar en oändlig loop. Använd signed-räknare vid nedräkning.

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

Förlust vid float till int

Vid konvertering från float till int förloras decimaldelen. Om värdet överskrider int-intervallet blir resultatet odefinierat.

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

Precisionsförlust från double till float

När ett double-värde med hög precision lagras som float försvinner siffror, vilket kan ackumuleras i långa beräkningar.

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

Överraskningar med char-tecken

Det är implementeringsdefinierat om char är signed. Använd unsigned char för bytevärden för att undvika negativa resultat.

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

Dividera och konvertera sedan

Om Ni först utför heltalsdivision och sedan typomvandlar går den förlorade decimaldelen inte att återställa. Omvandla före divisionen.

#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;
}

Jämföra intervall

Använd konstanterna i limits.h för att förstå vilket intervall en typ kan lagra innan Ni antar att ett värde får plats.

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

Defensiva konverteringar

Kontrollera intervall före förminskning, föredra bredare typer när Ni är osäkra och gör typomvandlingar explicita så att avsikten är tydlig.

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

Snabbtest

Testa Er förståelse av konverteringarnas fallgropar.

Sammanfattning: konverteringsfallgropar

Ni har lärt Er om riskerna med tysta konverteringar.

  • Förminskning kan orsaka spill eller trunkering
  • Blandning av signed och unsigned vänder på jämförelser
  • Unsigned-räknare går runt under noll
  • Omvandla före division för att behålla decimaldelar
  • Kontrollera intervall och gör typomvandlingar explicita
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
39
Lektioner
144

Vanliga frågor

Är lektionen ”Fallgropar vid konvertering” gratis?

Ja – hela texten till ”Fallgropar vid konvertering” kan läsas gratis här på webben. Om Ni vill öva interaktivt med en inbyggd kodredigerare och en AI-handledare som är tillgänglig dygnet runt och låsa upp resten av kursen i C Academy, kan Ni uppgradera till CoddyKit PRO. Kursen i C Academy innehåller totalt 4 lektioner.

Vad lär jag mig i ”Fallgropar vid konvertering”?

Överspill och trunkering. 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 ”Fallgropar vid konvertering”?

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. Implicit konvertering
  2. Explicita typomvandlingar
  3. Konvertering mellan heltal och flyttal
  4. Fallgropar vid konvertering
← Tillbaka till C Academy