2.2.9 Automaattinen tyypin muunnos (konversio)

Aritmeettisten lausekkeiden kohdalla mainittiin, että kahden erityyppisen luvun aritmeettisessa operaatiossa tapahtuu automaattinen tyypin muunnos eli konversio. Jos operaation operandeina on kokonaisluku ja liukuluku, muunnetaan kokonaisluku liukuluvuksi ennen operaation suorittamista. Näin varmistetaan se, että operaatioon osallistuvien operandien tyypit ovat samat.

Muunnostarpeen aiheuttaa kokonaislukujen ja liukulukujen esitystapojen erilaisuus sekä niiden vaatiman muistialueen erimittaisuus. Luonnollinen tapa suorittaa konversio on muuntaa vähemmän tilaa vaativa tyyppi enemmän tilaa vaativaksi. Tämän ajatuksen mukaisesti tietotyyppien välille voidaan piirtää seuraava konversiokaavio:

Automaattisen konversion vuoksi on seuraava yhteenlasku sallittu

'a' + 5 + 2.5

Yhteenlasku voidaan ajatella suoritettavan vasemmalta oikealle. Aluksi suoritetaan merkin a konversio kokonaisluvuksi (haetaan ASCII-arvo, joka on 97), jonka jälkeen suoritetaan kahden kokonaisluvun summa, 97+5. Tulos on kokonaisluku 102. Tulos konvertoidaan sitten liukuluvuksi 102.0, jonka jälkeen lasketaan summa 102.0+2.5, josta saadaan lopullinen vastaus 104.5, joka on liukuluku.

Automaattinen konversio tapahtuu myös sijoituslauseen yhteydessä. Kun sijoitus tapahtuu yllä esitetyn kaavion mukaisesti, eli pienempi tietotyyppi sijoitetaan suuremmalle varattuun tilaan, ei ongelmia pitäisi esiintyä. Sen sijaan, jos sijoitus tapahtuu suuremmasta tietotyypistä pienempään, voi tapahtua merkittävää tiedonhukkaa.

Jos esimerkiksi sijoitetaan kokonaisluku väliltä 0...255 merkkitietoa esittävään muuttujaan (konvertoidaan merkkitiedoksi), ei tapahdu mitään vahinkoa, sillä merkkitiedolle varatun tavun esittämä lukualue on juuri 0...255 (etumerkittömänä kokonaislukuna).

Jos sen sijaan sijoitetaan luku, jonka arvo on suurempi kuin 255, hukkuvat kokonaisluvun esityksen ensimmäisen tavun tiedot, eikä tallennettu tieto enää vastaa alkuperäistä:

Jos liukuluku tallennetaan kokonaislukuun, suoritetaan liukuluvulle katkaisu, eli hukataan luvun desimaaliosa. Näin ollen liukulukujen sijoittaminen kokonaislukuihin menee teoriassa ongelmitta. Käytännössä liukulukujen esitysmuoto mahdollistaa hyvin suurten ja toisaalta hyvin pienten lukujen esitysten. Tästä johtuen joudutaan helposti tilanteeseen, jossa liukuluvun esittämän luvun katkaistu arvo joko ei mahdu kokonaisluvun esitysalueeseen tai menee nollaksi.

Tilanne vastaa veden kaatamista isommasta sangosta pienempään. Jos isommassa sangossa on vettä vähemmän kuin mitä pienempään sankoon mahtuu, ei mitään vahinkoa pääse tapahtumaan. Jos taas vettä on enemmän kuin pienempään sankoon mahtuisi, niin kaadettaessa menetetään kaikki se vesi, joka jää yli.