Töissä tänään hakatessani VBAn kanssa päätä seinään totesin tuon. Totuusarvon koko on 16 bittiä. Miksi? Minä kun olen tottunut, että boolean vie vain yhden bitin. Vai enkö vain osaa? :)
No sehän on selvää, että muistia varataan tavuina aina. Siihen en osaa vastata, miksi se on 16 bittiä, mutta C++:n bool vie yleensä tavun ja WinAPIn BOOL taas on 32-bittinen. Aina on yhden bitin käyttäminen vaatinut SetBit- ja GetBit-viritelmiä.
Hirveää muistin tuhlausta! :) täytyy tarkastaa miten siellä sulautetussa järjestelmässä tuota muistia varataan, mutta ainakin muuttujien arvot heitti häränpyllyä kun vba:n booleania yritti sinne vastaavaan muistipaikkaan tunkea. Taas pykälää viisaampi.
Edit: Tai itseasiassa tarkemmin ajatellen siellä ei edes varata muistia. Käytössä on koko ajan "kaikki" muisti ja sinne muistiavaruuteen vaan osotellaan. Ja booleanit todella ovat vain yksittäisiä bittejä tuolla avaruudessa.
VB:ssä alunperin oli vain yksi kokonaislukumuuttuja, Integer. Sitten lisättiin mukaan Boolean jossain vaiheessa, ja yhteensopivuuden vuoksi siitä tehtiin sitten samalla Integerin kokoinen. Näihin aikoihin oli vielä vanha tuttu 16-bittinen Windowsikin käytössä, joten oli "loogista", että 16-bittiä oli se luku mihin tähdättiin.
Vähän logiikkaa lukujen takana, eli tätä aihetta sivuavaa tietoa:
Boolean False = Integer 0 = &H0
Boolean True = Integer -1 = &HFFFF
Long kaikki bitit merkattuna = -1& = &HFFFFFFFF
Long 16 alinta bittiä merkattuna = 65536 = &HFFFF&
Eli huomioitavaa on se, että -1 ja -1& ovat eri asioita, samalla tavoin kuin &HFFFF ja &HFFFF& ovat eri asioita.
Joten pieni pohdittava vielä lopuksi:
MsgBox True And &HFFFF&
Mikä lieneekään vastaus? :)
Kiitos vastauksista.
Merri kirjoitti:
Eli huomioitavaa on se, että -1 ja -1& ovat eri asioita, samalla tavoin kuin &HFFFF ja &HFFFF& ovat eri asioita.
Hmm... Millä tavoin eri asioita?
Edit: &-merkki luvun lopussa kertoo, että luku on Long-tyyppinen?
Aihe on jo aika vanha, joten et voi enää vastata siihen.