Τα δεδομένα που διακινούνται κατά την εκτέλεση ενός προγράμματος, μπορούν να είναι διαφόρων τύπων, όπως char, int, float, double κ.τ.λ. Μια παράσταση στη C η οποία εμπεριέχει μεταβλητές, σταθερές και τελεστές έχει ένα συγκεκριμένο τύπο που καθορίζεται από τον τύπο των μεταβλητών και σταθερών της.
Μια παράσταση στη C μπορεί να αποτελείται από μεταβλητές μέλη και σταθερές μέλη διαφόρων τύπων. Εδώ τίθεται το ερώτημα: πως καθορίζεται ο τύπος της παράστασης; Σε μια παράσταση όλα τα μέλη – δεδομένα της, μετατρέπονται στον τύπο του μέλους με την υψηλότερη ιεραρχία. Σε αυτή την περίπτωση λέμε ότι έχουμε αυτόματη μετατροπή τύπου.
Η ιεραρχία των βασικών τύπων δεδομένων της C με σειρά από το χαμηλότερο προς το υψηλότερο είναι η εξής: char, int, float και double.
Το αποτέλεσμα της παράστασης είναι του ίδιου τύπου δεδομένων με τον τύπο του ιεραρχικά υψηλότερου μέλους της παράστασης. Ακολουθεί ένα παράδειγμα:
int x, y;
double d;
x=10; y=15;
d=(x+y)/2
Σε αυτό το πρόγραμμα θα περιμέναμε ότι, η μεταβλητή d θα πάρει τιμή 12,5 (25/2). Όμως στην πραγματικότητα έχει τιμή 12. Αυτό διότι όλα τα μέλη της παράστασης (x+y)/2 είναι ακέραιοι αριθμοί και έτσι το αποτέλεσμα είναι ακέραιος αριθμός.
Για να έχουμε σωστό αποτέλεσμα θα πρέπει να γράψουμε την παράσταση ως εξής d=(x+y)/2.0 Έτσι επειδή η σταθερά 2.0 είναι τύπου double η παράσταση (x+y)/2.0 επιστρέφει τιμή double. Αυτό διότι ο τύπος double είναι ο ιεραρχικά υψηλότερος από όλους τους άλλους τύπους των μελών της παράστασης.
Στην αυτόματη και στη ρητή μετατροπή τύπου από ένα ιεραρχικά υψηλότερο τύπο σε χαμηλότερο, μπορεί να έχουμε απώλεια στην ακρίβεια των δεδομένων.
Όταν έχουμε ανάθεση τιμής μιας παράστασης σε μια μεταβλητή με τον τελεστή = , η τιμή της παράστασης μετατρέπεται στον τύπο της μεταβλητής που βρίσκεται αριστερά του τελεστή «=».
Κατά την μεταβίβαση ορισμάτων από μια συνάρτηση στις παραμέτρους μιας άλλης συνάρτησης, τα ορίσματα με τα οποία καλείται μια συνάρτηση μετατρέπονται στον τύπο των αντίστοιχων παραμέτρων της καλούμενης συνάρτησης.
Μελετήστε τον ακόλουθο κώδικα:
#include <avr/io.h>
void test(int x, double y)
{
lcd_print(“x= “, x, “y= “, y);
}
int main(void)
{
int a=10, b=5;
float f;
double d;
f = (a+b)/3.0; // Μετατροπή των a και b σε double λόγω της σταθεράς 3.0 η
// οποία είναι double
// Ο τύπος της παράστασης είναι double που μετατρέπεται σε
// float και εκχωρείται στην f
d = f; // Μετατροπή της f από float σε double και καταχώριση της
//τιμής στη μεταβλητή d
test(f, d); // Μετατροπή της f από float σε int για τη μεταβίβαση της στην
//αντίστοιχη παράμετρο της συνάρτησης test()
}
Μπορούμε να μετατρέψουμε το αποτέλεσμα μιας παράστασης σε μια τιμή ενός επιθυμητικού τύπου. Αυτή η δυνατότητα λέγεται ρητή μετατροπή τύπου. Για να ζητήσουμε μετατροπή τύπου μιας παράστασης, τοποθετούμε πριν από την παράσταση παρενθέσεις, όπου μέσα σε αυτές τοποθετούμε τον τύπο στον οποίο θέλουμε να μετατραπεί η παράσταση.
Παράδειγμα: Αν έχουμε για τις μεταβλητές x=5 και y=10 οι οποίες είναι τύπου int, τότε η παράσταση x+y έχει τιμή 15 και είναι τύπου int. Η παράσταση (float)(x+y) είναι τύπου float και έχει τιμή 15.0
Η ρητή μετατροπή τύπου μπορεί να χρησιμοποιηθεί και στη κλήση συναρτήσεων. Παράδειγμα: Έστω ότι έχουμε μια συνάρτηση με παραμέτρους τύπου float και πρωτότυπο:
void test(float x, float y);
Αυτή την συνάρτηση καλούμε με την συνάρτηση main() όπως φαίνεται στη συνέχεια:
int main()
{
int a=20, b=5;
test(a, b);
}
Με αυτό τον τρόπο που γράψαμε την συνάρτηση test( , ) ανάλογα τον μεταγλωττιστή μπορεί να πάρουμε προειδοποιητικό μήνυμα, για το λόγο ότι η test( , ) περιμένει δυο τιμές τύπου float, ενώ εμείς της δίνουμε δυο τιμές τύπου int.
Για να αντιμετωπίσουμε αυτή την δυσχέρεια, κάνουμε ρητή μετατροπή τύπου και μετατρέπουμε τον τύπο int των μεταβλητών σε float, όπως επιδεικνύεται στο ακόλουθο απόσπασμα κώδικα:
int main()
{
int a=20, b=5;
test((float)a, (float)b);
}