JAVA - ΕΝΟΤΗΤΑ 4 – byte and short Data Types
Στην σημερινή ενότητα θα συνεχίσουμε να μιλάμε για τα Integral Data types. Σας υπενθυμίζω ότι σε αυτή την κατηγορία ανήκουν τα byte, short, int και long data types.
Ήδη έχουμε μιλήσει στην προηγούμενη
ενότητα για τα int. Σε αυτή
την ενότητα θα μιλήσουμε για τα byte
και short.
Τα
byte data types είναι εκείνα που
δέχονται ακέραιους με εύρος αριθμών
από -128 έως 127. Είναι το μικρότερο είδος
των integer data types και
χρησιμοποιείται συνήθως όταν
διαχειριζόμαστε binary data όταν
διαβάζουμε κάποιο αρχείο ή όταν στέλνουμε
πληροφορίες δια μέσω του δικτύου σε
άλλα συστήματα. Νομίζω ότι καταλαβαίνεται
γιατί περιγράφοντας τον αριθμό 3 με 8
bits (byte) δημιουργεί πολύ
μικρότερο πακέτο πληροφορίας από το να
περιγράψω τον ίδιο αριθμό με 16 bits
(int). Και επειδή η Java
χρησιμοποιείται σε διάφορες
μικροσυσκευές με περιορισμένη μνήμη,
καλό είναι να γνωρίζουμε και αυτά τα
data types για να κάνουμε
οικονομία μνήμης.
Το
short είναι ίσως εκείνο το
data type που σπάνια θα
συναντήσετε σε προγράμματα Java.
Επειδή περιγράφει τους ακέραιους
αριθμούς με 16 bits έχει
εύρος από -32768 έως 32767.
Το να
ορίσουμε μια μεταβλητή σαν byte
ή short και να της
αναθέσουμε μια τιμή, ακολουθούμε ακριβώς
την ίδια διαδικασία όπως και με τα int
data types. Όμως όταν προσπαθήσουμε να
γράψουμε το ίδιο πρόγραμμα που γράψαμε
στην προηγούμενη ενότητα αντικαθιστώντας
το int με byte ή
short, τότε λαμβάνουμε ένα
λάθος που το μήνυμα του ίσως δεν είναι
τόσο ξεκάθαρο στην εξήγηση του και μας
προβληματίσει. Ας δούμε λοιπόν πρώτα
τον κώδικα και το λάθος.
Έχουμε λοιπόν αντικαταστήσει όλα τα
int data types σε byte.
Στην γραμμή 15 όμως λαμβάνουμε ένα
μήνυμα λάθους που αναφέρει ότι με την
πρόσθεση που πάμε να κάνουμε ίσως το
αποτέλεσμα μας να μην είναι ακριβής
όταν γίνεται αυτόματη μετατροπή από
byte σε int. Μας
εμείς δεν ορίσαμε κάτι τέτοιο. Απλά
περιμέναμε το άθροισμα δυο byte
αριθμών να μας επιστρέψει ένα byte
αποτέλεσμα. Όμως δεν βλέπουμε να
γίνεται αυτό. Ας εξηγήσουμε λοιπόν τι
συμβαίνει εδώ.
Η Java
όταν βλέπει ότι έχουμε ορίσει δύο
byte μεταβλητές και
προσπαθούμε να τις προσθέσουμε, δεν
γνωρίζει στην πραγματικότητα ότι έχουμε
αναθέσει μικρές τιμές (5 και 7 αντίστοιχα)
και ότι είμαστε μέσα στα όρια του byte.
Θεωρεί λοιπόν ότι για οποιαδήποτε
αριθμητική πράξη (πρόσθεση, πολλαπλασιασμό,
κτλ) ίσως η κάθε μεταβλητή έχει οριστεί
με τον ανώτατο αριθμό που μπορεί να
δεχτεί. Αυτό σημαίνει ότι το αποτέλεσμα
της πρόσθεσης στην συγκεκριμένη περίπτωση
λογικά θα είναι εκτός των ορίων του
byte. Οπότε η java
κάνει αυτόματη μετατροπή του byte
αποτελέσματος σε int. Ναι,
αλλά η μεταβλητή sum έχει
οριστεί σαν byte οπότε
περιμένει byte αποτέλεσμα.
Η Java λοιπόν μας προειδοποιεί
ότι προσπαθώντας να “χωρέσουμε” ένα
integer (16 bit) αριθμό
σε έναν byte (8 bit)
αριθμό θα χάσουμε σε ακρίβεια στο
τελικό αποτέλεσμα.
Με
την πιο πάνω συμπεριφορά, καταλαβαίνουμε
λοιπόν ότι η default συμπεριφορά
της Java όσο αφορά τους
ακεραίους είναι να προσπαθεί να τους
κάνει όλους int εκτός και
αν τους ορίσουμε διαφορετικά και με
τέτοιο τρόπο ώστε η Java να
καταλάβει την διαφορά. Θα το δούμε
άλλωστε αυτό άλλη μια φορά στην επόμενη
ενότητα που θα μιλήσουμε για τους long
αριθμούς.
Και
πως το λύνουμε αυτό? Με έναν πολύ απλό
τρόπο που ονομάζεται casting. Με
το casting αυτό που κάνουμε
στην πραγματικότητα είναι να πάρουμε
εμείς την ευθύνη και να ενημερώσουμε
τον compiler της Java
να συνεχίσει την αριθμητική πράξη
και να μετατρέψει το αποτέλεσμα σε byte
πριν το αναθέσει στην sum
μεταβλητή. Και πως το κάνουμε αυτό
πρακτικά? Βάζοντας απλά μέσα μια
παρένθεση, μπροστά από την πράξη της
πρόσθεσης, την λέξη byte. Τώρα
το αποτέλεσμα της πρόσθεσης πριν η Java
το αναθέσει στην μεταβλητή sum
θα το μετατρέψει σε byte
πρώτα και μετά θα κάνει την ανάθεση.
Τώρα το πρόγραμμα μας δεν έχει λάθος
και παίρνουμε το επιθυμητό αποτέλεσμα.
Μην ξεχάσετε να περικλύσετε την πράξη
της πρόσθεσης σε παρένθεση γιατί ειδάλλως
το casting θα εφαρμοστεί στην
πρώτη μεταβλητή μόνο (number 1)
και όχι στον αποτέλεσμα.
Ακριβώς
το ίδιο πρόβλημα θα είχαμε αντιμετωπίσει
εάν αντί για byte είχαμε
χρησιμοποιήσει short για
τα data type των μεταβλητών
μας. Επίσης, εάν είχαμε ορίσει την
μεταβλητή sum σαν int
τότε δεν θα χρειάζονταν καθόλου το
casting.
Μιχάλης
Κασάπογλου