egyszerû adattípusok
adattípusok általános jellemzõi
-
értéktartomány
-
helyfoglalás
-
kódolás (adatábrázolás)
-
szerkezet (összetett típusok esetén)
-
komponensek típusa (pl. egy rekord mezõinek típusa)
a kettes (bináris) számrendszer használata
-
bináris számjegyek vagy bitek (0 és 1)
-
helyiértékek (kettõ hatványai)
-
20 = 1, 21 = 2, 22 = 4, 23
= 8, 24 = 16, 25 = 32, 26 = 64, 27
= 128, 28 = 256, ...
-
bináris számrendszerben megadott egész szám
átváltása decimális számrendszerbe
-
példa: 10102 = 1*23 + 0*22
+ 1*21 + 0*20 = 1*8 + 1*2 = 1010
-
decimális számrendszerben megadott egész szám
átváltása bináris számrendszerbe
-
bináris számrendszerben megadott törtszám ("kettedestört")
átváltása decimális számrendszerbe (megjegyzés:
a helyiértékek a "kettedespont" után 2 negatív
egész hatványai lesznek, például 2-1=1/2,
2-2=1/4, 2-3=1/8, stb.)
-
példa: 0.1012 = 1*(1/2) + 0*(1/4) + 1*(1/8) =
(1/2) + (1/8) = 5/8 = 0.62510
-
decimális számrendszerben megadott törtszám (tizedestört)
átváltása bináris számrendszerbe
-
bináris számrendszerben megadott szám átváltása
hexadecimális számrendszerbe (négyes számjegy-csoportok
képzésével)
-
példa: 101100112 = (10112)(00112)
= (1110)(310) = (B16)(316)
= B316
-
hexadecimális számrendszerben megadott szám átváltása
bináris számrendszerbe
-
példa: A716 = (A16)(716)
= (1010)(710) = (10102)(01112)
= 101001112
decimális számrendszerben megadott egész szám
átváltása bináris számrendszerbe: az
eredmény kiszámításának lépései
-
a táblázat elsõ sorának elsõ oszlopába
az átváltandó számot írjuk be, ennek
a sornak a második oszlopát üresen hagyjuk;
-
a táblázat további sorait - sorban egymás után
- úgy számítjuk ki, hogy az utoljára kiszámított
sor elsõ oszlopában szereplõ értéket
(maradékosan) osztjuk 2-vel, és
-
az osztás (egész) eredményét a következõ
sor elsõ oszlopába,
-
az osztás maradékát pedig ennek a sornak a második
oszlopába írjuk;
-
ezt az eljárást addig folytatjuk, ameddig az osztás
eredménye 0 nem lesz.
179 |
|
89 |
1 |
44 |
1 |
22 |
0 |
11 |
0 |
5 |
1 |
2 |
1 |
1 |
0 |
0 |
1 |
az eredményt úgy kapjuk, hogy a második oszlopban
szereplõ maradékokat "visszafelé", azaz alulról
felfelé olvassuk:
179 = 101100112
decimális számrendszerben megadott törtszám
(tizedestört) átváltása bináris számrendszerbe:
az eredmény kiszámításának lépései
-
a táblázat elsõ sorának elsõ oszlopába
0-t, második oszlopába a tizedespontot, harmadik oszlopába
pedig az átváltandó szám tizedespont utáni
számjegyeit írjuk be;
-
a táblázat további sorait - sorban egymás után
- úgy számítjuk ki, hogy az utoljára kiszámított
sor elsõ oszlopában levõ egész értéket
figyelmen kívül hagyjuk és csak a harmadik oszlopában
szereplõ értéket szorozzuk 2-vel; a szorzás
eredményét a következõ sorba írjuk:
-
az egész értéket az elsõ oszlopba,
-
a tizedespontot a második oszlopba, és
-
a tizedespont utáni számjegyeket a harmadik oszlopba;
-
ezt az eljárást addig folytatjuk, ameddig a harmadik oszlopban
0-t nem kapunk.
0 |
. |
6875 |
1 |
. |
3750 |
0 |
. |
7500 |
1 |
. |
5000 |
1 |
. |
0000 |
az eredményt úgy kapjuk, hogy az elsõ oszlopban
szereplõ egész értékeket felülrõl
lefelé olvassuk:
0.687510 = 0.10112
a tizenhatos (hexadecimális) számrendszer használata
-
hexadecimális számjegyek
-
decimális számjegyek (0,1,...,9)
-
kiegészítõ számjegyek (A=10, B=11, C=12, D=13,
E=14, F=15)
-
hexadecimális helyiértékek (16 hatványai)
-
160 = 1, 161 = 16, 162 = 256, 163
= 4096, 164 = 65536, ...
-
hexadecimális számrendszerben megadott szám átváltása
decimális számrendszerbe
-
példa: A1916 = 10*162 + 1*161
+ 9*160 = 10*256 + 1*16 + 9*1 = 258510
-
decimális számrendszerben megadott szám átváltása
hexadecimális számrendszerbe (a legegyszerûbb elõször
a megadott számot bináris számrendszerbe átváltani,
majd ezt négyes számjegy-csoportok képzésével
egyszerûen hexadecimális számmá alakítani)
-
példa: 258510 = (átváltás
bináris számrendszerbe) = 1010000110012 = (10102)(00012)(10012)
= (1010)(110)(910) = (A16)(116)(916)
= A1916
a Turbo Pascal adattípusai
-
egyszerû (elemi) típusok
-
összetett (strukturált) típusok (további típusokból,
un. komponensekbõl épülnek fel)
-
tömb (array; a komponensek azonos típusúak)
-
rekord (record; a komponensek különbözõ típusúak)
-
...
sorszámozott vagy megszámlálható típusok
-
numerikus (egész) típusok
-
egész vagy elõjeles típusok
(az értéktartomány egész értékekbõl
áll)
-
elõjel nélküli típusok (az értéktartomány
nemnegatív egész értékekbõl áll)
-
byte (értéktartomány: 0..255; helyfoglalás:
1 bájt; kódolás: un. egyenes kódolás,
azaz az értékek kettes számrendszerbeli alakja felel
meg a biteknek)
-
word (értéktartomány: 0..65535; helyfoglalás:
2 bájt; kódolás: egyenes kódolás)
-
karakter típus
-
char (értéktartomány: #0..#255, ahol pl. #65
az ASCII kódtábla 65-ös kódú karakterét
jelenti (256 különbözõ karakter); helyfoglalás:
1 bájt; kódolás: ASCII,
ill. a 7 bites ASCII kódrendszernek a számítógépen
beállított kódtáblának megfelelõ,
a nemzetközi karakterkészleteket is tartalmazó 8
bites kiterjesztése)
-
logikai típus
-
Boolean (értéktartomány: False és True;
helyfoglalás: 1 bájt; kódolás: a False értéknek
a 00000000 érték felel meg, a True értéknek
pedig bármilyen, ettõl különbözõ érték,
alapértelmezésben 00000001)
egész vagy elõjeles típusok
-
shortint (értéktartomány: -128..127 közötti
egész számok; helyfoglalás: 1 bájt; kódolás:
kettes komplemens kód)
-
1. példa: 1 kettes komplemens alakja 00000001 (egyenes kódolás
pozitív számok esetén)
-
2. példa: -1 kettes komplemens alakja 11111111 (kettes komplemens
kódolás negatív számok esetén)
-
1. lépés: |-1| = 1 egyenes kódban 00000001
-
2. lépés: 00000001 egyes komplemens kódban (komplementálva)
11111110
-
3. lépés: 11111110 + 1 = 11111111 (O.K.)
-
3. példa: a kettes komplemens kódban megadott 10101010 bitsorozatnak
megfelelõ egész szám -86
-
1. lépés: 10101010 egyes komplemense 01010101
-
2. lépés: 01010101 + 1 = 01010110
-
3. lépés: egyenes kódolás esetén 01010110
= 64 + 16 + 4 + 2 = 86
-
4 lépés: az eredeti bitsorozat elõjelbitje 1
(negatív szám), tehát a végeredmény
-86 (O.K.)
-
integer (értéktartomány: -32768..32767 közötti
egész számok; helyfoglalás: 2 bájt; kódolás:
kettes komplemens kód)
-
longint (értéktartomány: -231..(231-1)
közötti egész számok; helyfoglalás: 4 bájt;
kódolás: kettes komplemens kód)
lebegõpontos számábrázolás (a Turbo
Pascal real típusa esetén)
-
számábrázolás nem zérus érték
esetén: kettes normálalakban (x = m*2k)
-
mantissza: 0.5 <= |m| < 1, m-et binárisan (kettedestört
alakban) ábrázoljuk, elhagyva a kezdõ 0.1 tagot, amely
minden m esetén megegyezik
-
karakterisztika: -128 < k < 128, ahol k-t többleteskódban
(k') ábrázoljuk (k' = k+128, ezért 0 < k' <
256)
-
számábrázolás zérus érték
esetén: az ábrázolt szám minden bitje 0
-
megjegyzés: ha a legalacsonyabb helyiértékû
bájt (LSB) minden bitje 0 (azaz ha normálalakban ábrázoljuk
a számot, a karakterisztika -128), akkor a többi bájt
értékétõl függetlenül az ábrázolt
szám zérus, vagyis 0.5*2-127-nél kisebb
abszolút értékû számot a Turbo Pascal
real
típusa nem képes ábrázolni
-
helyfoglalás: 6 bájt = 48 bit ( | 5. bájt = MSB
| 4. bájt | ... | 1. bájt | 0. bájt = LSB | )
-
MSB (Most Significant Byte; a legnagyobb helyiértékû
bájt, amely a memóriában a legmagasabb memóriacímen
helyezkedik el; a valós számot bitsorozatként ábrázolva
ez a bal szélsõ bájt)
-
bal szélsõ (legnagyobb helyiértékû) bit:
elõjelbit
(0 nemnegatív, 1
negatív számok esetén)
-
további (alacsonyabb helyiértékû) 7 bit: a kettedestört
alakban ábrázolt mantissza "kettedespont" utáni bináris
számjegyei az elsõ
(1/2-es helyiértékû) bit
elhagyásával, azaz az 1/4-es helyiértéktõl
kezdõdõen
-
példa: ha m = 0.1012
= 1*2-1 + 0*2-2 + 1*2-3
= 1*0.5 + 0*0.25 + 1*0.125 = 0.62510,
akkor MSB = 00100000
(ha m nyolcnál kevesebb kettedesjegybõl áll, egyszerûen
kiegészítjük megfelelõ számú nullával,
ha pedig több kettedesjegybõl áll, ezeket az MSB utáni
bájtokon ábrázoljuk, ld. alább)
-
az MSB 7 alacsonyabb helyiértékû bitje, és a
következõ 4 bájt (összesen 39 bit)
-
az ábrázolt szám mantisszájának bináris
számjegyei az 1/4-es helyiértéktõl kezdõdõen
(mivel 0.5 <= |m| < 1 teljesül, ezért minden mantissza
kettedestört alakban 0.1 módon kezdõdik, tehát
elég csak az 1/2-es helyiérték utáni biteket
ábrázolni)
-
LSB (Least Significant Byte; a legkisebb helyiértékû
bájt, amely a memóriában a legalacsonyabb memóriacímen
helyezkedik el)
-
az ábrázolt szám karakterisztikája többleteskódban
(eltolva 128-cal)
-
példák
-
+2.9..*10-39
= 0.5*2-127 = |00000000|...|00000000|00000001|
-
megjegyzés: ez a real típussal ábrázolható
legkisebb nem zérus érték
-
+0.25 = +0.5*2-1
= |00000000|...|00000000|01111111|
-
+0.5 = +0.5*20
= |00000000|...|00000000|10000000|
-
-0.5 = -0.5*20
= |10000000|...|00000000|10000000|
-
+0.625 = +0.625*20
= |00100000|...|00000000|10000000|
-
megjegyzés: 0.625 = 0.5 + 0.125 = 1/2 + 1/8, tehát
a mantissza kettedestört alakban m = 0.101 (amelybõl csak a
kezdõ 0.1 utáni bináris számjegyeket ábrázoljuk)
-
+1 = +0.5*21
= |00000000|...|00000000|10000001|
-
-2 = -0.5*22
= |10000000|...|00000000|10000010|
-
+1.7..*1038
= 0.99..*2127 = |01111111|...|11111111|11111111|
-
megjegyzés: ez a real típussal ábrázolható
legnagyobb (pozitív) érték
matematikai társprocesszor használatát igénylõ
valós típusok (az Options.Compiler
menüpont kiválasztásakor megjelenõ Compiler
Options ablakban be kell kapcsolni a Numeric Processing csoportban
levõ 8087/80287 opciót (vagy a forrásprogram
elején, a program kulcsszó elõtt el kell helyeznünk
egy {$N+} fordítói direktívát), hogy
használhassuk õket)
-
Single (4 bájtos lebegõpontos típus, 8 bites
karakterisztikával)
-
Double (8 bájtos lebegõpontos típus, 12 bites
karakterisztikával)
-
Extended (10 bájtos lebegõpontos típus, 15
bites karakterisztikával)
a Turbo Pascal különbözõ valós típusainak
pontossága (a Turbo Pascal, ha másként nem adjuk meg,
a valós számértékeket normálalakban
1 egész és 14 tizedesjeggyel, valamint 4 számjegyes
karakterisztikával írja ki; ezt felülbírálhatjuk
pl. writeln(x:30); módon, ekkor 17 tizedesjegyet fog kiírni,
de ennek csak extended típus esetén van értelme)
Pi értéke: 3.14159265358979324E+0000
-
Single: 3.14159274101257E+0000
(hat
tizedesjegyig pontos)
-
Real: 3.14159265358830E+0000
(tizenegy
tizedesjegyig pontos)
-
Double: 3.14159265358979312E+0000
(tizenöt
tizedesjegyig pontos)
-
Extended: 3.14159265358979324E+0000
'e' értéke: 2.71828182845904524E+0000
-
Single: 2.71828174591064E+0000
(hat
tizedesjegyig pontos)
-
Real: 2.71828182846002E+0000
(tíz
tizedesjegyig pontos)
-
Double: 2.71828182845904509E+0000
(tizenöt
tizedesjegyig pontos)
-
Extended: 2.71828182845904524E+0000
karakterlánc típus
-
string (értéktartomány: az üres (0 karakter
hosszúságú) string, továbbá minden elképzelhetõ
karakterkombináció min. egy, max. 255 számú
karakterbõl; helyfoglalás: 256 bájt; kódolás:
a string legelsõ (0-s sorszámú) bájtja a stringben
ténylegesen tárolt karakterek számát adja meg,
a többi (1..255 sorszámú) bájton pedig a karakterek
ASCII kódját tároljuk)
-
a string típus olyan összetett adattípusnak is tekinthetõ,
amelynek a komponensei a stringet alkotó karakterek, amelyek sorszámuk
alapján közvetlenül is elérhetõek (pl. s:='Hello!';
értékadás után writeln(s[2]); az s
string második karakterét, esetünkben az e karaktert
fogja kiírni a képernyõre); azonban a karakter-típusú
tömböktõl a stringeket megkülönbözteti
a string aktuális hosszát megadó, 0-s sorszámú
"karakter", amely karakter típusú tömbök esetén
nem létezik
-
példa: egy string karaktereinek kiírása
egymás alá, külön sorokba
-
csökkentett hosszúságú string (string[n],
ahol n egy 1 és 255 közötti természetes szám,
amely a stringben tárolható karakterek max. számát
adja meg)
egy string karaktereinek kiírása egymás alá,
külön sorokba
program pelda1;
uses crt;
var s:string[40];
i,k:byte;
begin
write('Kérek egy max. 40 karakterbõl álló
szöveget: ');
readln(s);
k:=byte(s[0]); {ugyanezt kapnánk a k:=length(s);
utasítással is}
writeln('A string hossza: ',k);
for i:=1 to k do
writeln(s[i]);
end.
a Java adattípusai
-
egyszerû, un. elemi típusok
-
numerikus (egész és karakter) típusok
-
byte (értéktartomány: -128..127; helyfoglalás:
1 bájt; kódolás: kettes komplemens kód)
-
short (értéktartomány: -32768..32767; helyfoglalás:
2 bájt; kódolás: kettes komplemens kód)
-
int (értéktartomány: -231..(231-1);
helyfoglalás: 4 bájt; kódolás: kettes komplemens
kód)
-
long (értéktartomány: -263..(263-1);
helyfoglalás: 8 bájt; kódolás: kettes komplemens
kód)
-
char (értéktartomány: 65536 különbözõ
karakter; helyfoglalás: 2 bájt; kódolás: Unicode)
-
numerikus (valós) típusok
-
float (értéktartomány: kb. -2128..2128
közötti valós számok; helyfoglalás: 4 bájt;
kódolás: lebegõpontos számábrázolás)
-
double (értéktartomány: kb. -21024..21024
közötti valós számok; helyfoglalás: 8 bájt;
kódolás: lebegõpontos
számábrázolás)
-
logikai típus
-
boolean (értéktartomány: true vagy false; helyfoglalás:
1 bájt)
-
összetett, un. referencia típusok
-
objektum-típusok vagy osztályok (pl. String)
-
tömbök (pl. String[] args)
lebegõpontos számábrázolás (a Java
double
típusa esetén az IEEE 754 szabvány szerint)
-
számábrázolás kettes normálalakban (x
= m*2k)
-
karakterisztika: -1022 <= k < 1025, ahol k-t többleteskódban
(k') ábrázoljuk (k' = k+1022, ezért 0<= k' <
2047)
-
mantissza: m-et binárisan (kettedestört alakban) ábrázoljuk,
és
-
ha -1021 <= k <= 1024 akkor 0.5 <= |m| < 1, ábrázoláskor
elhagyjuk a kezdõ 0.1 tagot, amely minden m esetén megegyezik
(azaz csak a kettedespont és az utána, az 1/2 helyiértéken
következõ 1 utáni bináris számjegyeket
ábrázoljuk)
-
ha k= -1022 akkor 0<= |m| < 1, ábrázoláskor
elhagyjuk a kezdõ 0. tagot, amely minden m esetén
megegyezik (azaz csak a kettedespont utáni bináris számjegyeket
ábrázoljuk)
-
helyfoglalás: 8 bájt
-
MSB (Most Significant Byte; a legnagyobb helyiértékû
bájt, amely a memóriában a legmagasabb memóriacímen
helyezkedik el)
-
bal szélsõ (legnagyobb helyiértékû) bit:
elõjelbit
(0 nemnegatív, 1 negatív számok esetén)
-
az MSB 7 alacsonyabb helyiértékû bitje, és a
következõ 4 bit (összesen 11 bit)
-
az ábrázolt szám karakterisztikája többleteskódban
(eltolva 1022-vel)
-
az MSB utáni bájt alacsonyabb helyiértékû
4 bitje és a következõ 6 bájt 6*8 = 48 bitje
(összesen 52 bit)
-
ha a karakterisztika = -1022, az ábrázolt szám mantisszájának
bináris számjegyei az 1/2-es helyiértéktõl
kezdõdõen (0. után)
-
az ábrázolható legkisebb (nem 0) érték:
2-52 * 2-1022 = 2-1074
-
ha a karakterisztika -1021 és +1024 közé esik, akkor
az ábrázolt szám mantisszájának bináris
számjegyei az 1/4-es helyiértéktõl kezdõdõen
(0.1 után)
-
az ábrázolható legnagyobb érték: 0.99.....9
* 21024 ~ 21024
-
ha a karakterisztika +1025, akkor vagy un. pozitív / negatív
végtelen, vagy un. NaN (Not-a-Number) értéket kapunk
(ez kb. megfelel a lebegõpontos túlcsordulásnak)
-
példák ( | 7. bájt = MSB | 6. bájt | ...
| 1. bájt | 0. bájt = LSB | alakban megadva az ábrázolt
értékeket)
-
+4.9*10-324(Double.MIN_VALUE)
= +1.0*2-1074
= |00000000|00000000|00000000|...|00000001|
-
+0.25 = +0.5*2-1
= |00111111|11010000|00000000|...|00000000|
-
+0.5 = +0.5*20
= |00111111|11100000|00000000|...|00000000|
-
-0.5 = -0.5*20
= |10111111|11100000|00000000|...|00000000|
-
+0.625 = +0.625*20
= |00111111|11100100|00000000|...|00000000|
-
megjegyzés: 0.625 = 0.5 + 0.125 = 1/2 + 1/8, tehát a
mantissza kettedestört alakban m = 0.101 (amelybõl csak a kezdõ
0.1 utáni bináris számjegyeket ábrázoljuk)
-
+1 = +0.5*21
= |00111111|11110000|00000000|...|00000000|
-
-2 = -0.5*22
= |11000000|00000000|00000000|...|00000000|
-
+1.7976931348623157*10308
(Double.MAX_VALUE) = +0.99...9*21024
= |01111111|11101111|11111111|...|11111111|
-
+1.0/0.0 (Double.POSITIVE_INFINITY;
formálisan +0.5*21025)
= |01111111|11110000|00000000|...|00000000|
-
-1.0/0.0 (Double.NEGATIVE_INFINITY;
formálisan -0.5*21025)
= |11111111|11110000|00000000|...|00000000|
-
Not-a-Number (Double.NaN; formálisan +0.75*21025)
= |01111111|11111000|00000000|...|00000000|
Boda István, 2003. november 2.