Ενώσεις

Το πρόγραμμα που είναι αποθηκευμένο στο αρχείο UNION1.C δίνει ένα πρώτο 
παράδειγμα των ενώσεων. Οι ενώσεις επιτρέπουν να προσεγγίσουμε τα ίδια 
δεομένα με διαφορετικούς τρόπους, ανάλογα με τον τύπο της επεξεργασίας που 
θέλουμε να υλοποιήσουμε. Ακόμη μας επιτρέπουν να χρησιμοποιήσουμε τα ίδια 
δεδομένα με διαφορετικά ονόματα.

Στο παράδειγμά μας η ένωση έχει δύο στοχεία. Το πρώτο στοιχείο είναι ο 
ακέραιος value, που προφανώς απαιτεί 2 bytes αποθηκευτικού χώρου. Το 
δεύτερο στοιχείο της ένωσης είναι μιά εγγραφή με το όνομα half που περιέχει 
ως πεδία δύο χαρακτήρες, τους first και second. Η εγγραφή απαιτεί και αυτή 2 
bytes αποθηκευτικού χώρου. Τα δύο στοιχεία της ένωσης, δηλαδή ο ακέραιος και 
η εγγραφή, μοιράζονται τον ίδιο χώρο στη μνήμη. Αυτή είναι η λειτουργία της 
ένωσης: επιτρέπει δεδομένα διαφορετικού τύπου να μοιράζονται τον ίδιο χώρο 
μνήμης. Η ένωση του παραδείγματος επιτρέπει την αποθήκευση ενός ακεραίου σε 
μιά θέση μνήμης και στη συνέχεια η πρόσβαση και ο χειρισμός των δύο 'μισών' 
της δυαδικής παράστασης ξεχωριστά. Η τεχνική αυτή χρησιμοποιείται στο 
πακετάρισμα bytes σε καταχωρητές μέσω των οποίων γίνεται η επικοινωνία με 
το λειτουργικό σύστημα. 

Η πρόσβαση στα στοιχεία της ένωσης γίνεται με τον ίδιο τρόπο που γίνεται η 
πρόσβαση στα πεδία των εγγραφών. Το πρόγραμμα εκτελεί μιά επανάληψη και 
εκτυπώνει τον μετρητή με δύο τρόπους, δηλαδή ως ακέραιο και ως ζεύγος bytes. 
Και στις δύο περιπτώσεις η εκτύπωση έχει δεκαεξαδική μορφή. Η εκτύπωση 
δίνεται παρακάτω.

          c       c        0
    89ab   ffab   ff89
    134a     4a     13
    9ce9   ffe9    ff9c
    2688   ff88     26
    b027     27   ffb0
    39c6   ffc6     39
    c365     65   ffc3
    4d04      4     4d

Δεδομένου οτι ο μετρητής index είναι του τύπου long int είναι φανερό οτι η 
εκχώρηση του μετρητή στον ακέραιο number.value προκαλεί αποκοπή των δύο 
πλέον σημαντικών bytes του μετρητή. Έτσι ο ακέραιος που εμφανίζεται είναι 
πάντα περιορισμένος στα 4 δεκαεξαδικά ψηφία. Στην εκτύπωση των χαρακτήρων 
σε δεκαεξαδική μορφή έχουμε μερικές φορές την εμφάνιση 2 f's μπροστά από τα 
δεκεαξαδικά ψηφία. Αυτό εξηγείται ως εξής. Η εκτύπωση ενός χαρακτήρα σε 
δεκαεξαδική μορφή προκαλεί την αυτόματη μετατροπή του σε ακέραια μορφή, 
άρα εμφανίζονται 2 bytes ή 4 δεκαεξαδικά ψηφία. Αν η αυτόματη μετατροπή 
συνατήσει στο πλέον σημαντικό bit του χαρακτήρα τη μονάδα τότε θεψρεί οτι 
πρόκειται γιά αρνητική δυαδική παράσταση με βάση το συμπλήρωμα του 2. 
Επομένως το νέο byte γεμίζει όλο με μονάδες (τα 2 f's) ώστε να διατηρηθεί η 
ορθότητα της παράστασης. Αν το πλέον σημαντικό bit είναι 0 τότε τα μηδενικά 
επεκτείνονται στο νέο byte αφού ο χαρακτήρας θεωρείται ως θετικός αριθμός. 
Γιά να αποφευχθούν τα 2 f's πρέπει να γίνει ρητή μετατροπή τύπου με εκχώρηση 
ή casting και ακύρωση (mask out) των ανεπιθύμητων f's. Τέτοιοι χειρισμοί θα 
εξεταστούν όταν θα συζητήσουμε τους χειρσιμούς σε επίπεδο bit..

Ένα άλλο ενδιαφέρον σημείο της εκτύπωσης είναι οτι μας δίνεται η ευκαιρία να 
εξετάσουμε τον τρόπο αποθήκευσης των ακεράιων στη μνήμη. Βλέπουμε οτι τα 
bytes εκτυπώνονται σε αντίστροφη σειρά όταν προσεγγίζονται ως χαρακτήρες. 
Αυτό σημαίνει οτι η αποθήκευση των ακεραίων γίνεται στη μορφή 'lsbyte first' 
δηλαδή το λογότερο σημαντικό byte αποθηκεύεται πρώτο. Μπορείτε να 
επεκτείνετε τον πειραματισμό σε άλλους τύπους αριθμών έτσι ώστε να 
διαπιστώσετε πως ακριβώς αποθηκεύονται στη μνήμη.

Περιεχόμενα Κεφαλαίου