Muunnosten sudenkuopat
Ylivuoto ja katkaisu.
Muunnosten sudenkuopat on ilmainen C Academy-oppitunti CoddyKitissä. Tämä on oppitunti 4/4. Voit lukea koko oppitunnin alta ilmaiseksi ja harjoitella sen jälkeen käytännössä selaimessa sisäänrakennetulla koodieditorilla ja ympäri vuorokauden käytettävissä olevan tekoälytuutorin avulla. Oppitunti kuuluu C Academy-oppimispolkuun, ja edistymisesi synkronoituu verkon ja CoddyKit-sovelluksen välillä. C Academy-kurssilla on yhteensä 4 oppituntia.
Muunnokset voivat aiheuttaa ongelmia
Huomaamattomat muunnokset ovat käteviä, mutta voivat aiheuttaa ylivuotoja, katkaisuja ja etumerkkiin liittyviä yllätyksiä. Tässä oppitunnissa käsitellään näitä ongelmia.
#include <stdio.h>
int main(void) {
printf("Beware silent conversions\n");
return 0;
}Kokonaisluvun ylivuoto
Kun arvo sijoitetaan kohteena olevaan kokonaislukutyyppiin, johon se on liian suuri, arvo kiertyy tai tietoa häviää.
#include <stdio.h>
#include <limits.h>
int main(void) {
int max = INT_MAX;
printf("INT_MAX = %d\n", max);
return 0;
}Kaventamisen aiheuttama katkaisu
Kun suuri arvo sijoitetaan pienempään tyyppiin, vain alimmat bitit säilyvät ja luku turmeltuu huomaamatta.
#include <stdio.h>
int main(void) {
int big = 300;
unsigned char small = (unsigned char)big;
printf("small = %d\n", small);
return 0;
}Etumerkillisen ja etumerkittömän tyypin sekoittaminen
Etumerkillisen ja etumerkittömän tyypin sekoittaminen muuntaa etumerkillisen arvon etumerkittömäksi, jolloin negatiiviset luvut muuttuvat valtaviksi positiivisiksi luvuiksi.
#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;
}Silmukkalaskurin ansa
unsigned-tyyppinen silmukkalaskuri, joka alittaa nollan, kiertyy valtavaksi arvoksi ja aiheuttaa loputtoman silmukan. Käyttäkää vähennettäessä etumerkillisiä laskureita.
#include <stdio.h>
int main(void) {
for (int i = 3; i >= 0; i--)
printf("%d ", i);
printf("\n");
return 0;
}Float-arvon muuntaminen intiksi
Float-arvon muuntaminen intiksi poistaa murto-osan. Jos arvo ylittää int-tyypin alueen, tulos on määrittelemätön.
#include <stdio.h>
int main(void) {
double d = 3.99;
int n = (int)d;
printf("n = %d\n", n);
return 0;
}Tarkkuuden menetys double-tyypistä float-tyyppiin
Suuren tarkkuuden doublen tallentaminen float-muuttujaan poistaa numeroita, mikä voi kertaantua pitkissä laskutoimituksissa.
#include <stdio.h>
int main(void) {
double d = 1.123456789012345;
float f = (float)d;
printf("%.7f\n", f);
return 0;
}Char-tyypin etumerkin yllätykset
Se, onko char etumerkillinen, riippuu toteutuksesta. Käyttäkää tavuarvoille tyyppiä unsigned char negatiivisten tulosten välttämiseksi.
#include <stdio.h>
int main(void) {
unsigned char b = 200;
printf("b = %d\n", b);
return 0;
}Jakolasku ja sen jälkeinen muunnos
Kokonaislukujakolaskun tekeminen ja tuloksen muuntaminen myöhemmin ei palauta menetettyä murto-osaa. Tehkää muunnos ennen jakamista.
#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;
}Kokojen vertaaminen
Käyttäkää limits.h-tiedoston vakioita selvittääksenne, minkä alueen tyyppi voi sisältää, ennen kuin oletatte arvon mahtuvan siihen.
#include <stdio.h>
#include <limits.h>
int main(void) {
printf("char range: %d to %d\n", CHAR_MIN, CHAR_MAX);
return 0;
}Muunnosten varmistaminen
Tarkistakaa alueet ennen kaventamista, suosikaa epävarmoissa tilanteissa leveämpiä tyyppejä ja tehkää tyyppimuunnokset näkyviksi, jotta tarkoitus on selvä.
#include <stdio.h>
int main(void) {
long value = 200;
if (value >= 0 && value <= 255)
printf("fits in a byte: %ld\n", value);
return 0;
}Pikatarkistus
Testatkaa, miten hyvin ymmärrätte muunnosten ongelmakohdat.
Kertaus: muunnosten ongelmakohdat
Opitte huomaamattomien muunnosten vaarat.
- Kaventaminen voi aiheuttaa ylivuodon tai katkaista arvon
- Etumerkillisten ja etumerkittömien tyyppien sekoittaminen kääntää vertailujen tuloksia
- Etumerkittömät laskurit kiertyvät nollan alapuolella
- Tehkää tyyppimuunnos ennen jakamista, jotta murto-osat säilyvät
- Tarkistakaa alueet ja tehkää tyyppimuunnokset näkyviksi
Opi C tekoälytuutorin avulla — ilmaiseksi
Kirjoita ja suorita oikeaa koodia selaimessa, saa välitöntä apua tekoälytuutorilta ympäri vuorokauden ja jatka siitä, mihin jäit, verkossa tai sovelluksessa.
- Kurssit
- 39
- Oppitunnit
- 144
Usein kysytyt kysymykset
Onko oppitunti ”Muunnosten sudenkuopat” ilmainen?
Kyllä – oppitunnin ”Muunnosten sudenkuopat” koko tekstin voi lukea täällä verkossa ilmaiseksi. Jos haluat harjoitella interaktiivisesti sisäänrakennetulla koodieditorilla ja ympäri vuorokauden käytettävissä olevan tekoälytuutorin avulla sekä avata koko C Academy-kurssin, päivitä CoddyKit PROhon. C Academy-kurssilla on yhteensä 4 oppituntia.
Mitä opin oppitunnilla ”Muunnosten sudenkuopat”?
Ylivuoto ja katkaisu. Harjoittelet C Academy-aihetta koodilla, jonka suoritat suoraan selaimessa. Ympäri vuorokauden käytettävissä oleva tekoälytuutori vastaa kysymyksiisi oppitunnin aikana.
Tarvitsenko kokemusta aloittaakseni C Academy-opiskelun?
Aiempi kokemus ei ole tarpeen. CoddyKitin C Academy-oppimispolku sopii vasta-alkajista edistyneisiin, joten voit aloittaa tästä tai alusta ja edetä omaan tahtiisi. Tämä on oppitunti 4/4.
Kuinka kauan ”Muunnosten sudenkuopat”-oppitunnin suorittaminen kestää?
Useimmat CoddyKitin oppitunnit kestävät noin 5–10 minuuttia. Jokainen oppitunti on lyhyt ja interaktiivinen, joten edistyt tasaisesti ja voit jatkaa siitä, mihin jäit – sekä verkossa että sovelluksessa.
Voinko kirjoittaa ja suorittaa koodia tällä C Academy-oppitunnilla?
Kyllä. Jokainen C Academy-oppitunti sisältää sisäänrakennetun koodieditorin, joten voit kirjoittaa ja suorittaa oikeaa koodia suoraan selaimessa ja saada välitöntä palautetta tekoälyltä – paikallista asennusta ei tarvita.
Kaikki tämän kurssin oppitunnit
- Implisiittiset muunnokset
- Eksplisiittiset tyyppimuunnokset
- Kokonaisluvun ja liukuluvun muunnokset
- Muunnosten sudenkuopat