Kirjautuminen

Haku

Tehtävät

Koodit: VB6: Matemaattiset muuttujatyypit

Kirjoittaja: Merri

Kirjoitettu: 06.06.2006 – 06.06.2006

Tagit: ohjelmointitavat, koodi näytille, vinkki

Visual Basic 6:ssa on useita muuttujatyyppejä, jotka kuitenkin ovat osittain rajallisia verrattaessa muutamiin muihin ohjelmointikieliin ja kääntäjiin. VB näet ei anna kovinkaan laajaa skaalaa erilaisia muuttujatyyppejä, vaan tarjonta rajoittuu vain muutamiin. Tämä voi aiheuttaa ongelmia, joita joutuu kiertämään. Kaikkien ongelmien selvittäminen ei ole edes mahdollista. Näistä tiedoista voi olla runsaasti hyötyä numeroiden kanssa pelleillessä.

Boolean (16 bittiä / 2 tavua)
Voi sisältää joko arvon False tai True. Numeroina False = 0, True = -1. Tätä tietoa voi käyttää hyväksi joissakin kaavoissa ilman että tarvitsee sortua monimutkaisiin If Then Else -riveihin.

Booleanin 16-bittisyys tulee historiallisista syistä: vanhoissa VB:n versioissa oli vain 16-bittinen Integer, johon Boolean oli lähinnä yksinkertainen "huijaus".

Byte (8 bittiä / tavu)
Voi olla kokonaisluku välillä 0-255. Mitään suurta erikoista ei tarvitse ottaa huomioon Byteä käytettäessä.

Integer (16 bittiä / 2 tavua)
Integerin yli tavu on varattu tiedolle siitä, onko luku negatiivinen vaiko ei. Integer voi olla väliltä -32768 - 32767. Binäärinä ajateltuna luku -1 on &HFFFF ja -32768 on &H8000.

Tähän väliin lienee sopivaa huomauttaa, että mikäli erikseen asiaa ei määritetä, käyttää VB pienintä sopivaa muuttujatyyppiä lukujen esittämiseen. Täten heksaluku &HFFFF on -1 eikä 65535, jonka taas saa kirjoittamalla &HFFFF& - näiden molempien binääriarvo on silti sama, ainoa ero tulee bittien määrässä! On siis tärkeää huomioida, mikä muuttujatyyppi on kulloinkin käytössä.

Long (32 bittiä / 4 tavua)
Long on kuten Integer, mutta isompi. Luku on väliltä -2147483648 ... 2147483647

Jos luet tiedostoa, josta saat 16-bittisen luvun joka ei voi olla negatiivinen, voit muuttaa Integerin Longiksi varsin helposti. Katso esimerkki yksi koodilistauksesta.

Currency (64 bittiä / 8 tavua)
Currency on VB:n erikoisempi muuttujatyyppi. Se on 64-bittinen "kokonaisluku" kuten Byte, Integer ja Long, mutta voi silti sisältää neljä desimaalilukua. Tämä on toteutettu yksinkertaisesti siirtämällä desimaalipilkkua vasemmalle. Toisin kuin seuraavaksi esittelyyn tulevat liukulukutyypit, Currency on aina tarkka sisältämänsä arvon suhteen. Currency on paras vaihtoehto, jos tarvitsee käsitellä esimerkiksi suuria rahasummia.

Binäärinä Currency näyttää tältä:

00000000 00000001 = 1      (Integer)
00000000 00000001 = 0.0001 (Currency)
00100111 00010000 = 1      (Currency)
00100111 00010000 = 10000  (Integer)

Single (32 bittiä / 4 tavua)
Single on liukuluku. Tämä tarkoittaa sitä, että muuttuja sisältää tarkasti muutaman luvun, jonka lisäksi osa biteistä on varattu sisältämään tietoa desimaalipilkun paikasta. Tämä johtaa siihen, että vaikka luku voi olla todella pieni tai todella iso, sen tarkkuus ei riitä kovin pitkälle. Muuttuja on hyödyllinen jos luvun tarkkuus ei ole tärkeää, kunhan se on "sinne päin".

Double (64 bittiä / 8 tavua)
Double on tarkempi kuin Single ja voi sisältää enemmän tarkasti muistettuja lukuja. Se voi myös olla huomattavasti isompi/pienempi. Liukulukujen epätarkkuus pätee silti siinäkin.

Decimal (96 bittiä / 12 tavua)
Decimal on eräänlaista jatkoa Integer -> Long -linjalle. Tätä muuttujatyyppiä voi käyttää vain Variant-muuttujatyypin kautta. Variant on todella hidas käyttää, johtuen sen helppokäyttöisyydestä ja joustavuudesta. Kaiken lisäksi koodiin ei voi suoraan kirjoittaa Decimalin kokoluokkaan meneviä lukuja, vaan ne on pakko syöttää esimerkiksi tekstinä (String) ja muuttaa vasta sitten erillisellä kutsulla Decimaliksi.

Decimal voi olla väliltä -79228162514264337593543950335 ... 79228162514264337593543950335


Muuttujakomentoja
VB:ssä voi muuntaa muuttujia toiseen muuttujatyyppiin käyttämällä seuraavia komentoja:
- CBool (Boolean: 0 = False, muu luku muuntuu Trueksi)
- CByte (Byte)
- CInt (Integer)
- CLng (Long)
- CCur (Currency)
- CSng (Single)
- CDbl (Double)
- CDec (Variant, jonka alatyypiksi on määritetty Decimal)

Huomioi että CBoolia lukuunottamatta nostatutat virheen, jos yrität asettaa niin suurta lukua muuttujatyypille ettei se sellaista kykene sulattamaan.

Muuta huomioitavaa
Matemaattisten operaattorien suhteen toimiminen on ongelmallista erittäin suurten lukujen kanssa. Niin And, Or, Xor, Mod kuin \ toimivat vain ja ainoastaan korkeintaan 32-bittisten lukujen kanssa. Toisinsanoen raja on Longissa. Lisäksi Currencyä ei voi käsitellä binääritasolla suoraan, vaan Currency muuntuu aina Longiksi ennen kuin se joutuu kosketuksiin edellämainittujen operaattoreiden kanssa.

' Esimerkki 1: Integer -> Long -muunnos binääritasolla
Option Explicit

Private Sub Form_Load()
    Dim IntegerLuku As Integer, LongLuku As Long
    IntegerLuku = -1
    LongLuku = IntegerLuku And &HFFFF&
    MsgBox LongLuku
End Sub


' Esimerkki 2: Long -> Currency -muunnos siten, että binääriarvon ylintä bittiä ei käsitellä negatiivimerkkaajana
Private Sub Form_Load()
    Dim LongLuku As Long, CurrencyLuku As Currency
    LongLuku = CLng(-1)
    If LongLuku < 0 Then
        CurrencyLuku = CCur(LongLuku And &H7FFFFFFF) + 2147483648#
    Else
        CurrencyLuku = LongLuku
    End If
    MsgBox CurrencyLuku
End Sub

Kommentit

Antti Laaksonen [07.06.2006 01:06:39]

#

Mainio katsaus. Ehkä tuosta mystisestä Decimal-tyypistä voisi olla koodiesimerkki.

setä [07.06.2006 22:55:35]

#

Decimal-tyypillä voi suorittaa tarkkoja aritmeettisia laskutoimituksia (max 29 numeroa). Myös desimaalilukuja voi käyttää, mutta ei eksponentti esitystä. Lausekkeessa oltava ainakin yksi decimal-tyypiksi määritetty muuttuja, jotta laskenta suoritetaan decimal-tarkkuudella.

Merri [09.06.2006 20:57:39]

#

Piti tehdä hieman korjauksia: Decimal onkin 96-bittinen eikä 64-bittinen, kuten muistelin. Asiat eivät kuitenkaan muutu miksikään: hidas ja epäkäytännöllinen muuttujatyyppi se pitkälti silti on, vaikka voikin olla todella suurikokoinen. Tavanomaiset plus-, miinus-, kerto- ja jakolaskut ovat hieman rajoittavia.

Kirjoita kommentti

Muista lukea kirjoitusohjeet.
Tietoa sivustosta