Ερώτηση προς τους ειδικούς C

M

minoss

Guest
Γεια σας έχω μια ερώτηση για τους ειδικούς C. Δεν μπορώ να βρω μια απάντηση σε οποιοδήποτε βιβλίο. Για παράδειγμα: Αν έχω ένα long int μεταβλητή με όνομα Α και να κάνω έναν υπολογισμό. A = x * y? Και τις μεταβλητές x και y είναι οι τύποι float, η μεταβλητή Α θα μετατραπεί αυτόματα σε float. Η ερώτησή μου είναι, πόσο καιρό είναι μια μεταβλητή float; Για το σύνολο του χρόνου του προγράμματος, ή μήπως πέσει πίσω σε long int, αν είναι δυνατόν; Regards Michael
 
Υποθέτω ότι ο Α δεν μπορούν να μετατραπούν σε float becaue είναι σταθερό, όταν κηρύσσει την Α var. Μπορεί να μιλάτε για τη μορφή πώς τα δεδομένα θα αποθηκεύονται σε ένα και το αυτό θα πρέπει να αποθηκεύονται σε μορφή κινητής σημείο; Από την άλλη πλευρά το μήκος της μνήμης να κρατήσει και τη μορφή της είναι compiler και των ειδικών μηχανημάτων. Παρακαλώ ρίξτε μια ματιά στο εγχειρίδιο του compiler να βρείτε πώς bytes η Α καταλαμβάνουν. Πραγματικά καλό compiler πρέπει να παράγει προειδοποίηση, όταν θα προσπαθήσει να κάνει τέτοια εκχώρηση. Αν compiler είναι πρότυπο ANSI συγκεκριμένες, ρίξτε μια ματιά στο πρότυπο ANSI ήταν μετατροπή τύπου έχει καθοριστεί για lvalue σε ανάθεση. Παρακαλώ ρίξτε μια ματιά στο K & R ρήτρα βιβλίο 2.7 Εφόσον η μετατροπή τύπου περιγράφεται. Ως παράδειγμα lasst - πρότυπο πρέπει να ζητείται η γνώμη.
 
Προσπαθήστε να χρησιμοποιείτε χειροκίνητο (δεν είμαι σίγουρος ότι αυτό το δικαίωμα ένδειξη στην αγγλική γλώσσα) μετατροπής: ανυπόγραφο καιρό Α, Β? Float Γ? C = (float) Α + (float) Β
 
[Quote = arturt134] Προσπαθήστε να χρησιμοποιείτε χειροκίνητο (δεν είμαι σίγουρος ότι αυτό το δικαίωμα ένδειξη στην αγγλική γλώσσα) μετατροπής: ανυπόγραφο καιρό Α, Β? Float Γ? C = (float) Α + (float) B [/quote] Αυτό είναι που ονομάζεται επίσης ως χύτευσης τύπου ... Regards
 
foat και καιρό θα μπορούσε να έχει διαφορετικές μορφές και χύτευσης τύπου μπορεί να οδηγήσει σε καταστροφή δεδομένων.
 
float και long int έχουν διαφορετικές μορφές. Ως εκ τούτου τύπου χύτευσης είναι απαραίτητη.
 
Τύπος χύτευση Υποθέτω θα πω compiler πως πρέπει να επεξεργαστεί αυτά τα δεδομένα ως διαφορετικού τύπου, αλλά δεν (αν δεν κάνω λάθος) τη μετατροπή των δεδομένων από μια μορφή σε άλλη. Υπάρχουν ειδικές λειτουργίες στην βιβλιοθήκη της C (ρίξτε μια ματιά στο 2,7 K & R book) χρησιμοποιείται για τη μετατροπή εκείνων που προέρχονται από μια μορφή σε άλλη.
 
float x, y? καιρό? .... A = x * y? Ο κώδικας που παράγεται από το C compiler κάνει τα εξής: 1) υπολογίζει το προϊόν x * y ως float (χρησιμοποιώντας το πρότυπο κινητής ρουτίνα σημείο) 2) το αποτέλεσμα αυτό μετατρέπεται σε μήκος αποκοπής (δεν στρογγυλοποίησης) και την κατάταξή τους A. δεν εφαρμόζεται κανένα μέτρο σε αυτή τη μετατροπή? στην περίπτωση που υπάρχει υπερχείλιση μπορείτε να πάρετε ένα λάθος αποτέλεσμα. (Αν θέλετε στρογγυλοποίηση, θα πρέπει να έχετε A = x * y + .5?). Ο μεταγλωττιστής μπορεί να δημιουργήσει μια προειδοποίηση κατά την εκτέλεση αυτού του τύπου των σιωπηρών μετατροπή από υποδιαστολής σε ακέραιο τα είδη (ανάλογα με τον compiler και το επίπεδο συναγερμού που έχετε ορίσει). Regards Z
 
Συμφωνώ με friends.If δεν θέλετε απώλεια δεδομένων όταν τύπου χύτευση ή τη μετατροπή, θα πρέπει να ορίσετε μεταβλητές carefully.I σας συνιστούμε να ορίσετε όλες αυτές επιπλέουν ως type.Then μπορείτε να μετατρέψετε και / ή να κάνετε εργασίες σε αυτό. Cheers, Αναλυτής.
 
Αν ορίσετε μια ως long int, τότε παραμένει ένα long int. Ο πολλαπλασιασμός γίνεται με τη χρήση κινητής υποδιαστολής, τότε το προϊόν μετατρέπεται σε long int και αποθηκεύονται σε Α. Εδώ είναι ένα απόσπασμα από το spec ANSI που περιγράφει τη μετατροπή ... 6.3.1.4 Ρεάλ κυμαινόμενο και ακέραιος Όταν μια πεπερασμένη αξία της ακίνητης κυμαινόμενο τύπου μετατρέπεται σε ακέραιο τύπο, εκτός από _Bool, το κλασματικό μέρος απορρίπτεται (δηλαδή, η τιμή περικόπτεται προς το μηδέν). Εάν η αξία του αναπόσπαστο τμήμα δεν μπορεί να εκπροσωπείται από τον ακέραιο τύπο, η συμπεριφορά είναι απροσδιόριστη.
 
Ο καλύτερος τρόπος για να το δοκιμάσουμε, είναι να κάνει κάποιες εξετάσεις .... Έχω εξετάσει την πηγή συναρμολογητή στην compiler μου (είμαι με τη χρήση IAR C για AVR): ανυπόγραφο α, β? Επιπλέουν γ, δ? C = a / b? / / Πρώτο σταθερό τμήμα σημείο, δίπλα από τη μετατροπή σε σταθερό σημείο κινητής υποδιαστολής δ = (float) α / (float) β? / / πρώτη μετατροπή του κάθε σταθερή μεταβλητή σημείο να κινητής υποδιαστολής, δίπλα διαίρεση σημείο floting
 

Welcome to EDABoard.com

Sponsor

Back
Top