Elméleti alapozás
Java-nyelv (egyszerű) adattípusai
Numerikus egész
A numerikus egész bemeneti adatok egész számmal kifejezhető mennyiségi jellemzőket képesek tárolni.
Attól függően, hogy milyen jellegű az adat, illetve a programozónak mire van szüksége, a Java-nyelvben négyféle numerikus egésszel dolgozhatunk:
-
byte – tárolás 8 biten – számtartománya –128 és +127 között,
-
short – tárolás 16 biten – számtartománya –32,768 és +32,767 között,
-
int – tárolás 32 biten – számtartománya –2,147,483,648 és +2,147,483,647 között,
-
long – tárolás 64 biten – számtartománya –9,223,372,036,854,775,808 és +9,223,372,036,854,775,807 között.
Az alábbi érdekes, futtatható Java-kódban kiírjuk a numerikus adattípusok alsó és felső tárolási határait:
public class Main {
public static void main(String[] args) {
System.out.println(Byte.MIN_VALUE);
System.out.println(Short.MIN_VALUE);
System.out.println(Integer.MIN_VALUE);
System.out.println(Long.MIN_VALUE);
System.out.println();
System.out.println(Byte.MAX_VALUE);
System.out.println(Short.MAX_VALUE);
System.out.println(Integer.MAX_VALUE);
System.out.println(Long.MAX_VALUE);
System.out.println();
System.out.println(Float.MIN_VALUE);
System.out.println(Double.MIN_VALUE);
System.out.println();
System.out.println(Float.MAX_VALUE);
System.out.println(Double.MAX_VALUE);
}
}
Végeredmény:
-128
-32768
-2147483648
-9223372036854775808
127
32767
2147483647
9223372036854775807
1.4E-45
4.9E-324
3.4028235E38
1.7976931348623157E308
No de mi értelme a kisebb típusú egészeknek, ha nagy adattartományokkal is dolgozhatunk? A kisebb típusok:
-
kisebb memóriahelyet foglalnak,
-
végrehajtáskor gyorsabban futnak.
Az egyik legáltalánosabban használt numerikus egész az int (integer). Az integeres műveletek végeredménye általában szintén integer, de osztásnál és túl nagy számok esetében adatvesztés léphet fel. Az alábbi, futtatható kódban…
public class Main {
public static void main(String[] args) {
int a = 7;
int b = 10;
System.out.println(a + b);
System.out.println(a - b);
System.out.println(a * b);
System.out.println(a / b);
}
}
Végeredmény:
17
-3
70
0
…az osztás már nem egész számmal kifejezhető eredményt ad, azonban mivel a kimeneti adat int típusú, adatvesztés lép fel, amelyet a fordító 0-val jelez. (Valójában az adat csonkolódik, egy másik igazán gyönyörű szakmai szóval letránkolódik.) A megoldás az úgynevezett kasztolás (típuskényszerítés): át kell konvertálnunk a típust egy olyan típusba, amely képes fogadni nem egész, lebegőpontos számokat (itt float).
public class Main {
public static void main(String[] args) {
int a = 7;
int b = 10;
System.out.println(a + b);
System.out.println(a - b);
System.out.println(a * b);
System.out.println((float)a / b);
}
}
Végeredmény:
17
-3
70
0.7
Típuskényszeríthetünk akár "röptében" is (5 / 4f)...
public class Main {
public static void main(String[] args) {
System.out.println(5 / 4f);
}
}
Végeredmény:
1.25
...mert f (float) nélkül az eredmény csonkolódna (1).
Ugyanezt kell tennünk (azaz kasztolnunk kell), ha a végeredmény várhatólag meg fogja haladni a beállított adattípus által tárolható adattartományt:
public class Main {
public static void main(String[] args) {
int a = 2147483647;
int b = 2147483647;
System.out.println(a + b);
}
}
Végeredmény:
-2
A fenti kódban az összeadás hibás eredményt fog adni. A probléma megoldása:
public class Main {
public static void main(String[] args) {
int a = 2147483647;
int b = 2147483647;
System.out.println((long)a + b);
}
}
Végeredmény:
4294967294
Érdekes futtatható Java-kód!
Most pedig nézzünk meg egy érdekes, futtatható Java-kódot, amely előregyártott-beépített függvények segítségével „bűvészkedik” az 50 számon (int szam = 50;). Például átváltja bináris, oktális, hexadecimális számra, megmondja az előjelét, stb.:
public class Main {
public static void main(String[] args) {
int szam = 50;
System.out.println(Integer.SIZE + " bit");
System.out.println(Integer.signum(szam));
System.out.println(Integer.toBinaryString(szam));
System.out.println(Integer.toOctalString(szam));
System.out.println(Integer.toHexString(szam));
System.out.println(Integer.class);
}
}
Végeredmény:
32 bit
1
110010
62
32
class java.lang.Integer