Tämän viikon tehtävät liittyvät datan esittämiseen ja sijoittumiseen muistissa. Osoitteessa http://babbage.cs.qc.edu/IEEE-754/ on erinomainen apuväline liukulukujen tarkasteluun.
Seuraavalla koodilla voidaan tarkastella muuttujan tietotyypin vaikutusta sen sisältöön.
#include <stdio.h> int main(int argc, char **argv) //Ohjelman suoritus alkaa main-funktiolla, //joka saa kaksi parametria käynnistyessään: //1. kertoo sille annetujen parametrien //määrän ja 2. on osoite parametritaulukkoon { int S=0x40400000; //Luodaan kokonaislukumuuttuja ja alustetaan se float F; //Luodaan liukulukutyyppinen muuttuja void * np; //Luodaan tyypitön osoitin float * fp; //Luodaan osoitin liukulukuun np = &S; //Kopioidaan kokonaisluvun osoite toiseen muuttujaan fp = (float *) np;//Pakotetaan kääntäjä luulemaan muuttujaa liukuluvuksi F = *fp; //Kopioidaan muuttujan sisältö liukulukumuuttujaan printf("Kokonaisluku %d on liukulukuna %e.\n",S,F); return 0; //ja poistutaan nollalla. }
Miten pitää muuttuja S alustaa, jotta saadaan liukuluku 2.00000? Entä 10.5?
Tee koodi, jossa vähennät toisistaan hyvin suuren ja hyvin pienen liukuluvun. Mitä voit huomata tuloksesta? Kokeile erilaisia suuruusluokkia.
Tee ohjelma, jossa esittelet seuraavat muuttujat
struct f { char c; int i; short s; }; struct f S_F; short S; int I; char C;
Tarkastele näiden muuttujien sijoittumista muistiin. (Vihje: Muuttujen tyypin voit pakottaa toiseksi seuraavasti (tyyppi) muuttuja, esim. void * A = (void *) &S_F; ja voit tulostaa sen esim. heksana printf:n parametrilla %x.