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.

Μιχάλης Κασάπογλου

Archive

Contact Form

Send