C Academy · Oppitunti

Muunnosten sudenkuopat

Ylivuoto ja katkaisu.

Oppitunti 4/413 vaihetta

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
Aloita maksutta

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

  1. Implisiittiset muunnokset
  2. Eksplisiittiset tyyppimuunnokset
  3. Kokonaisluvun ja liukuluvun muunnokset
  4. Muunnosten sudenkuopat
← Takaisin: C Academy