panoupanou Δημοσ. 1 Δεκεμβρίου 2011 Δημοσ. 1 Δεκεμβρίου 2011 Γεια σας. Για την μεταγλώτιση των προγραμμάτων μου σε C, χρησιμοποιώ τον gcc σε linux system. Πώς μπορώ να δώ, στην υπάρχουσα έκδοση που εχω εγκαταστήσει (4.4.4), πόσα bit αναπαραστασης είναι ο κάθε τύπος των floating point numbers (float, double , long double)? Λόγω, της αριθμητικής ακρίβειας που απαιτούν οι εφαρμογές μου θέλω να γνωρίζω αν όντως ο long double είναι 80 bit η παραπανω. Ευχαριστώ Κώστας
migf1 Δημοσ. 1 Δεκεμβρίου 2011 Δημοσ. 1 Δεκεμβρίου 2011 Γεια σας. Για την μεταγλώτιση των προγραμμάτων μου σε C, χρησιμοποιώ τον gcc σε linux system. Πώς μπορώ να δώ, στην υπάρχουσα έκδοση που εχω εγκαταστήσει (4.4.4), πόσα bit αναπαραστασης είναι ο κάθε τύπος των floating point numbers (float, double , long double)? Λόγω, της αριθμητικής ακρίβειας που απαιτούν οι εφαρμογές μου θέλω να γνωρίζω αν όντως ο long double είναι 80 bit η παραπανω. Ευχαριστώ Κώστας > printf( "%zu\n", sizeof( float ) * 8 ); // κλπ
panoupanou Δημοσ. 1 Δεκεμβρίου 2011 Μέλος Δημοσ. 1 Δεκεμβρίου 2011 Οκ τα εντόπισα. Ευχαριστώ. migf1 δεν τον ειχα ξαναδει αυτον το προσδιοριστη της printf (%zu).
migf1 Δημοσ. 1 Δεκεμβρίου 2011 Δημοσ. 1 Δεκεμβρίου 2011 Ο %z είναι μόνο για integer types και λέει στην printf να περιμένει τιμή που επιστρέφεται από sizeof() ... o %u είναι ο κλασσικός για unsigned.
defacer Δημοσ. 1 Δεκεμβρίου 2011 Δημοσ. 1 Δεκεμβρίου 2011 Ο %z είναι μόνο για integer types και λέει στην printf να περιμένει τιμή που επιστρέφεται από sizeof() ... o %u είναι ο κλασσικός για unsigned. Και γω πρώτη φορά βλέπω τον %z, αλλά τι νόημα έχει το u αν το z είναι για τιμές από sizeof() που είναι πάντα unsigned?
migf1 Δημοσ. 1 Δεκεμβρίου 2011 Δημοσ. 1 Δεκεμβρίου 2011 Και γω πρώτη φορά βλέπω τον %z, αλλά τι νόημα έχει το u αν το z είναι για τιμές από sizeof() που είναι πάντα unsigned? Επειδή ο size_t τύπος επιστροφής της sizeof() είναι implementation defined. Το %z είναι portable length specifier. EDIT: Να το εξηγήσω λίγο περισσότερο για όσους δεν είναι εξοικειωμένοι με τη γλώσσα... Γράφοντας... > printf("%u", sizeof( something) ); printf("%lu", sizeof( something) ); printf("%llu", sizeof( something) ); μόνο το ένα θα περάσει το compilation χωρίς warning. Γράφοντας... > printf("%zu", sizeof( something) ); είναι ο portable τρόπος να τυπώνουμε τύπους size_t με όλους τους compilers.
defacer Δημοσ. 1 Δεκεμβρίου 2011 Δημοσ. 1 Δεκεμβρίου 2011 Επειδή ο size_t τύπος επιστροφής της sizeof() είναι implementation defined. Το %z είναι portable length specifier. Λοιπόν στο ενδιάμεσο το έψαξα γιατί με έτρωγε... Το σωστό θεωρητικά είναι όντως %zu. Απο κει και πέρα, στην πράξη φαντάζομαι ότι διαφορά μπορεί να προκύψει μόνο αν κάνεις compile σε little endian σύστημα όπου ο int είναι 32 bit ενώ ο size_t είναι 64, στην οποία περίπτωση θα εμφανιστεί η λανθασμένη τιμή μηδέν. Εφόσον ο caller καθαρίζει το stack πάντα στην printf δε βλέπω δυνατότητα για να γίνει κάτι άλλο στραβό αν βάλεις %d αντί για %z. Απο κει και πέρα το %u αν και σωστό μου φαίνεται πως δέν κάνει κάτι γιατί θα έπρεπε να μιλάμε για τουλάχιστον 2GiB μέγεθος του type μέχρι να φτάσει να μπορεί να το δει κανείς σαν αρνητικό (που στην πράξη αποκλείεται). EDIT: Φυσικά (duh) δεν είναι legal να γράψεις σκέτο %z γιατί το z είναι length specifier και χρειάζεται οπωσδήποτε και type specifier (όπως το u). Επίσης είναι documented στο ISO9899-1990, παρ. 6.3.3.4 ότι ο size_t είναι unsigned, επομένως θα μπορούσε η printf να πάρει το %u σαν δεδομένο όταν δει %z: The value of the result is implementation-defined and its type (an unsigned integral type) is size_t... Ευχαριστώ για το έναυσμα!
migf1 Δημοσ. 1 Δεκεμβρίου 2011 Δημοσ. 1 Δεκεμβρίου 2011 Είχα κάνει edit την ώρα που έγραφες, δοκίμασε το σε διάφορους compilers. Δοκίμασε και με %d αντί για %u... χωρίς z μπροστά θα έχεις warnings, με z δεν θα έχεις.
defacer Δημοσ. 1 Δεκεμβρίου 2011 Δημοσ. 1 Δεκεμβρίου 2011 Είχα κάνει edit την ώρα που έγραφες, δοκίμασε το σε διάφορους compilers. Δοκίμασε και με %d αντί για %u... χωρίς z μπροστά θα έχεις warnings, με z δεν θα έχεις. Ναι λογικό είναι να έχω warnings, δεν έχω αντίρρηση σ' αυτά που λες -- απλά περιέργεια.
migf1 Δημοσ. 1 Δεκεμβρίου 2011 Δημοσ. 1 Δεκεμβρίου 2011 Δεν υπονόησα πως έχεις αντίρρηση, απλά στο επισήμανα επειδή έγραφες εκείνη την ώρα.
Προτεινόμενες αναρτήσεις
Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε
Πρέπει να είστε μέλος για να αφήσετε σχόλιο
Δημιουργία λογαριασμού
Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!
Δημιουργία νέου λογαριασμούΣύνδεση
Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.
Συνδεθείτε τώρα