Ilkka Koivistoinen 13.02.2002

Edellinen

Seuraava

3.6 Java ohjelman tietotyypit

Javassa tieto on sidottu aina olioihin, joihin palataan kurssin loppuosassa. Kuitenkin perustietotyypit eli tyyppien primitiivit on sisäänrakennettu Javaan eivätkä ne käyttäydy kuten oliot. Perustietotyyppejä on kahdeksan kappaletta. Perustietotyypit ja niiden varaama tila on esitetty taulukossa 1. 

Taulukko 1. Javan perustietotyypit

Kutsumanimi

Nimi

Tilanvaraus bitteinä

tavu

byte

8

lyhyt integer

short

16

integer

int

32

pitkä integer

long

64

totuusarvo

boolean

8

merkki

char

16

liukuluku

float

32

kaksoistarkkuuden luku

double

64

Bitillä tarkoitetaan tietokoneen muistissa olevan muistipaikan tilaa, joka voi olla kaksi eri tilaa. Tilat ovat joko 0 tai 1. Täten byte koostuu kahdeksasta tällaisesta muistipaikasta ja kahdeksan bitin yhdistelmällä voi olla 28=256 eri tilaa eli kombinaatiota. Jos tiloilla kuvataan numeroita, voidaan käsitellä numerot 0 - 255 eli tavulla voidaan käsitellä kymmenlukujärjestelmän lukuja 0 - 255.

Javassa kaikki lukujen perustietotyypit ovat etumerkillisiä, joten jokaista tyyppiä voidaan käsitellä kuten etumerkillistä numeroa. Tästä aiheutuu, että jokaisesta tyypistä menetetään yksi bitti. Esimerkiksi int tyyppi on aina 32 bittiä riippumatta käytetystä järjestelmäalustasta ja sillä voidaan osoittaa lukualuetta -2,147,483,648 - 2,147,483,647 =231-1.

Luku voidaan pakottaa tiettyyn muotoon luvun perään lisättävällä loppuliitteellä eli literaalilla.

Esimerkiksi

2 Luku on int tyyppiä ja siten 32 bittiä pitkä
2L Luku on long tyyppiä ja siten 64 bittiä pitkä
2.0F Luku 2.0 on float tyyppiä ja siten 32 bittiä pitkä
2.0 tai 2.0D Luku 2.0 on double tyyppiä ja siten 64 bittiä pitkä
2.0E1 2.0× 10+01 on aina double
true boolean
"jono" merkkijono on aina lainausmerkeissä
'a' merkki on aina heittomerkkien sisässä
0776 oktaaliluku 776
0x1A heksaluku 1A

Numerot tallentuvat luonnollisella tavalla, koska kymmenjärjestelmän luvut voi helposti muuttaa kaksilukujärjestelmään kuten matematiikan tunnilla (ainakin laajan) on opittu. Numeroiden käsittelyssä tulee ottaa huomioon int-tyypin suurin arvo ja float ja double -tyypien itseisarvoltaan suurin luku e , jolle pätee 1+e =1. Luku e liittyy siis javan laskentatarkkuuteen, joka on käytetystä typpimäärityksestä johtuen sama jokaiselle järjestelmäalustalle. Tämä tulee muistaa erityisesti verrattaessa laskemalla saatuja reaalilukuja toisiinsa.

Liukuluvulla tarkoitetaan desimaaliluvun esittämistä muodossa wpe1.jpg (1530 bytes), joka lyhennetään muotoon mantissaEeksponetti. Esimerkiki  wpe5.jpg (1259 bytes)olisi muotoa 5,4321E34. Jokainen luku voidaan esittää tässä muodossa. Tyypin float lukualueen itseisarvo on [1.4E-45,3.4E+38] ja double tyypin lukualueen itseisarvo on  [4.9E-324,1.7+E308]. On sanottu, että jos joku onnistuu konstruoimaan matemaattisen tehtävän, jolle tämä doublen lukualue ei riitä, voisi tutkia itsekriittisesti käyttämäänsä matemaattista mallia.

Totuusarvoja boolean on kaksi true ja false.

Merkeille char on varattu 16 bittiä. Täten 16 bitin yhdistelmällä on 216 = 65536 eri tilaa, joten char -tyyppisiä merkkejä voi olla näin monta. Kirjainmerkkejä vastaava koodattu bittiyhdistelmä on nimeltään UNICODE -koodi. Se on viimekädessä sopimuksen mukainen. Isot kirjaimet ovat luonnollisesti eri merkkejä kuin pienet ja erikoismerkit vievät omat paikkansa koodissa. Merkit, jonka ensimmäiset bitit ovat nollia, ovat erikoisasemassa. Niitä käytetään näyttölaitteen ohjauskoodina. Huomautettakoon, että useimmat edistyneemmät tekstinkäsittelyohjelmat käyttävät tekstin seassa omaa tekstinmuotoilukieltään, joka ei ole UNICODE-standardin mukainen. Vanhentuneita koodikarttoja ovat mm. 8 -bittinen Ascii -koodisto. UNICODE:n käsittelyyn palataan myöhemmin tässä kurssissa. Mainittakoon kuitenkin, että ohjelmoijan ei juurikaan tarvitse tuntea UNICODE -koodin tarkempaa sisältöä. (Euro €, saadaan painamalla alt + 0128. Yleisesti, mikä tahansa merkki saadaan näkyville näppäilemällä alt + merkin koodinumero. Esimerkiksi N=alt + 0078)

Koska useimmissa vanhoissa tekstinkäsittelyohjelmissa on kuitenkin vielä käytössä ASCII -standardin mukainen merkkien koodaus, on se seuraavassa kahdessa kappaleessa käyty lyhyesti läpi. (Tämä havaittiin jo käytettäessä JDK:ta komentokehoteessa windows 95 -ympäristössä.) Voit hypätä ne rauhassa yli, jos et tarvitse niitä enää missään.

Esimerkki 3.

public class e3
{
   public static void main (String[] args)
   {
      System.out.println("int "+ 2);
      System.out.println("long "+ 1234567);
      System.out.println("float "+2.0F);
      System.out.println("double "+1.23D-45);
      boolean b=true;
      System.out.println("boolean "+ b);
   }
}

Perustyyppien lisäksi javassa voi määritellä omia tyyppejä perustyyppien avulla. Omat tyypit ilmoitetaan ohjelmalle avainsanalla class. Käytettäessä tätä luodaan luokka. Luokkien käsittelyyn palaamme olio-ohjelmointikurssin luvussa 8.

Huomautettakoon, että merkkijono ei ole Javan perustietotyyppi, kuten ylläoleva taulukko saattaa antaa ymmärtää.

3.6.1 PerusASCII (katso koodikartta tästä)

Perus ASCII-koodissa kukin merkki ilmoitetaan 7 bitin jonona, jolloin eri merkkejä voi olla 27=128. Kukin bittiyhdistelmä vastaa tiettyä merkkiä.. Perusascii ei tunne eri kielten erikoismerkkejä. Tämä kierretään osittain laajennetulla ASCII-koodilla.

3.6.2 Laajennettu ASCII (katso koodikartta tästä)

Useimmat tietokoneet tallettavat tietoa 8 bitin yksikköinä eli tavuina. Tämä johtuu pitkälti tietokoneen elektroniikan rakenteesta, johon ei tässä yhteydessä ole syytä puuttua. Alun perin perusasciikoodiin lisättiin kahdeksanneksi bitiksi ns. pariteettibitti. Pariteettibitti lasketaan tavussa olevan seitsemän ensimmäisen bitin informaatiosta. Mikäli 1-bittejä on pariton määrä, on pariteettibitti 1, muulloin se on 0. Tämä tehtiin alun alkaen tietokoneen sisäisen tiedonsiirron varmistamiseksi. (Ennen ja jälkeen siirron pariteettibitin tulee olla sama. Mikäli näin ei ole, siirretään tieto uudestaan). Uudemmissa mikrotietokoneissa ja tiedonsiirtoverkoissa tiedonsiirto varmistettiin toisella tavalla ja tavun kahdeksas bitti on voitu ottaa mukaan ASCII -koodiin jolloin merkkejä saadaan esitetyksi 256. Esimerkiksi skandimerkit Åäö ovat laajennusosassa. ASCII -koodiin voi tutustua useimpien ohjelmakäsikirjojen liitteistä. Käyttöä hankaloittaa tietokoneen eri kieliasetukset, jolloin laajennusosan merkit 128 - 255 näkyvät eri tavalla eri koneissa.

3.6.3 Tietotyyppien tyyppimuutokset

Usein varsinkin olioita käsiteltäessä joudutaan tietotyyppi muuttamaan kesken kaiken toiseksi. Tämä tapahtuu usein sillä seurauksella, että osa informaatiosta häviää. Kuitenkin tarvittaessa tietotyyppi muuttuu toiseksi laittamalla = merkin jälkeen sijoituslauseessa sulkuihin tuloksen tyyppi. Sijoituslauseeseen tutustutaan tuonnempana, mutta nyt esitellään tietotyypin muunnos sijoituslauseessa esimerkkinä. Tyyppimuunnoksiin joudumme palaamaan tarkemmin itse asiassa useaan otteeseen tämän kurssin aikana

Esimerkki 4.

public class e4
{
   public static void main (String args[])
   {
      int i,j=5;
      double x=3.14F;
      System.out.println("Alussa j ja x on "+j+ " " +x);
      i = (int) x;
      x= (double) j;
      System.out.println("Nyt i ja x on "+i+ " " +x);
      System.out.println("int muunnoksessa luku katkaistiin");
      System.out.println("double muunnoksessa lukuun lisättiin desimaaleiksi 0:ia");
   }
}

Joskus tarvitsee muuttaa Stringtyypin muuttuja int -tyypiksi. Tämä tehdään Integer-luokan metodilla parseInt seuraavasti.

String valtatie="66";
int vt=Integer.parseInt(valtatie);

Vastaavat muunnokset löytyvät muille numerotyypeille. Luonnollisesti muunnos voi onnistua vain, kun muutettava String -tyypin muuttuja sisältää järkevän numeron. Seuraava päätyy auttamattomasti ajoaikana virheeseen

String valtatie="Paris -Texas all night long";
int vt=Integer.parseInt(valtatie);

Ilkka Koivistoinen 13.02.2002

Edellinen

Seuraava