Viikkoharjoitus 2

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.

Tehtävä 1

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?

Tehtävä 2

Tee koodi, jossa vähennät toisistaan hyvin suuren ja hyvin pienen liukuluvun. Mitä voit huomata tuloksesta? Kokeile erilaisia suuruusluokkia.

Tehtävä 3

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.