Fallgropar vid konvertering
Överspill och trunkering.
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
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
- Implicit konvertering
- Explicita typomvandlingar
- Konvertering mellan heltal och flyttal
- Fallgropar vid konvertering