gon1332 Δημοσ. 16 Φεβρουαρίου 2015 Δημοσ. 16 Φεβρουαρίου 2015 Με το link από c-faq του migf1, ξεκαθάρισα και πείστικα για το "C byte". Πλέον παραμένει το δεύτερο ερώτημά μου.
migf1 Δημοσ. 16 Φεβρουαρίου 2015 Δημοσ. 16 Φεβρουαρίου 2015 Εφόσον ο int έχει μέγεθος 2 ή 4 "C bytes" γιατί η sizeof να είναι ίδια με αυτή του χαρακτήρα; Σύμφωνα με τα προηγούμενα που είπες κι αυτά που ξέρω, το sizeof(char) == sizeof(int)) μεταφ- ράζεται σε: "Το sizeof(char) σε μία αρχιτεκτονική όπου το "C byte", είναι 16-bits, είναι ίδιο με το sizeof(int) σε μία αρχιτεκτονική όπου το "C byte" είναι 8-bits". Διότι το byte δεν είναι 8bits σε αυτές τις αρχιτεκτονικές (δες τι έγραψα για την CHAR_BIT παραπάνω). EDIT: Μαζί ποστάραμε. EDIT2: Πλέον παραμένει το δεύτερο ερώτημά μου.Ποιο ήταν το 2ο ερώτημα; EDIT3: Εφόσον ο int έχει μέγεθος 2 ή 4 "C bytes" γιατί η sizeof να είναι ίδια με αυτή του χαρακτήρα;Αν εννοείς πως sizeof(char) == sizeof(int) δεν νομίζω να ισχύει πουθενά αυτό, διότι το πρότυπο απαιτεί ο char να είναι 1 byte ενώ ο int να είναι τουλάχιστον 2 bytes (με όσα bits κι αν έχει το byte). EDIT4: ... Υπάρχουν αρχιτεκτονικές που ο char χρειάζεται 9 bits αλλά το sizeof(char) δίνει 1. Επίσης μπορεί να έχουμε υλοποίηση του char ως 16 bits και πάλι το sizeof(char) θα δίνει 1 (και επίσης θα ισχύει sizeof(char) == sizeof(int)). ... Α τώρα το είδα αυτό. Για αυτό ρώταγε ο gon. @imitheos, είσαι σίγουρος πως ισχύει αυτό; Εκτός πια αν μιλάς για non-compliant compilers.
gon1332 Δημοσ. 16 Φεβρουαρίου 2015 Δημοσ. 16 Φεβρουαρίου 2015 @migf1 Τελικά εκεί που κατέληξες είμαι κι εγώ. You followed the clues.
migf1 Δημοσ. 16 Φεβρουαρίου 2015 Δημοσ. 16 Φεβρουαρίου 2015 @migf1 Τελικά εκεί που κατέληξες είμαι κι εγώ. You followed the clues. Βασικά εγώ δεν είχα τέτοια απορία, γιατί δεν έχω ξανακούσει sizeof(char) == sizeof(int) σε compliant compiler.
H_ANARXIA_EINAI_PSEMA Δημοσ. 16 Φεβρουαρίου 2015 Μέλος Δημοσ. 16 Φεβρουαρίου 2015 @ migf1: Καλός ο κώδικας σου. Ευανάγνωστος. Thanks.
defacer Δημοσ. 16 Φεβρουαρίου 2015 Δημοσ. 16 Φεβρουαρίου 2015 EDIT3: Αν εννοείς πως sizeof(char) == sizeof(int) δεν νομίζω να ισχύει πουθενά αυτό, διότι το πρότυπο απαιτεί ο char να είναι 1 byte ενώ ο int να είναι τουλάχιστον 2 bytes (με όσα bits κι αν έχει το byte). Όχι, απαιτεί να καλύπτει ένα ελάχιστο πεδίο τιμών. Αυτό (θεωρητικά) δε σημαίνει ότι το sizeof του πρέπει να είναι παραπάνω από 1.
gon1332 Δημοσ. 16 Φεβρουαρίου 2015 Δημοσ. 16 Φεβρουαρίου 2015 Όχι, απαιτεί να καλύπτει ένα ελάχιστο πεδίο τιμών. Αυτό (θεωρητικά) δε σημαίνει ότι το sizeof του πρέπει να είναι παραπάνω από 1. To sizeof ποιανού; Και πάλι, όπως το είπες, το sizeof του int και πάλι πρέπει να είναι μεγαλύτερο του char, no;! EDIT: Ungets το κοκκινισμένο κομμάτι. Κατάλαβα τί εννοείς. . Αλλά και πάλι...σόρρυ για την αμφιβολία, αλλά ψάχνω κάποια πηγή και δεν βρίσκω τίποτα. Το GNU C reference manual δίνει 32-bits τα οποία μπορούν να κρατήσουν το τάδε range. Τέλος.
defacer Δημοσ. 16 Φεβρουαρίου 2015 Δημοσ. 16 Φεβρουαρίου 2015 Όχι. Θα μπορούσε να υπάρχει μια πλατφόρμα όπου CHAR_BITS = 500 και στην οποία το sizeof όλων ανεξαιρέτως των integral types είναι 1. Copy paste από το link σου: The standard even allows signed char and long to have the same range, though such platforms are very unusual. Βέβαια το standard έχει ανάγει το "ο,τι δεν απαγορεύεται επιτρέπεται" σε υψηλή τέχνη, οπότε τέτοια συμπεράσματα πολλές φορές δε βγαίνουν εύκολα. Αλλά αν το δεις εκ των υστέρων νομίζω είναι απλό: Το char μπορεί να είναι όσο μεγάλο θέλεις (minimum 2^8) Το int μπορεί να είναι όσο μεγάλο θέλεις (minimum 2^16) Άρα το char και το int μπορούν να είναι το ίδιο μεγάλα Το λεπτό σημείο είναι βέβαια να είσαι σίγουρος πως δεν υπάρχει κάπου κάτι άλλο που να απαγορεύει το συμπέρασμα.
gon1332 Δημοσ. 17 Φεβρουαρίου 2015 Δημοσ. 17 Φεβρουαρίου 2015 Όχι. Θα μπορούσε να υπάρχει μια πλατφόρμα όπου CHAR_BITS = 500 και στην οποία το sizeof όλων ανεξαιρέτως των integral types είναι 1. Copy paste από το link σου: Αχά. Κατάλαβα. Επίσης το πήρε το μάτι μου κι αυτό. Αν το συνδυάσουμε και με το παρακάτω στο link που έδωσα, τότε βγαίνει άκρη: The integer data types range in size from at least 8 bits to at least 32 bits. The C99 standard extends this range to include integer sizes of at least 64 bits. You should use integer types for storing whole number values (and the char data type for storing characters). The sizes and ranges listed for these types are minimums; depending on your computer platform, these sizes and ranges may be larger.
migf1 Δημοσ. 17 Φεβρουαρίου 2015 Δημοσ. 17 Φεβρουαρίου 2015 Δεν έχω πρόχειρο τώρα το πρότυπο (είμαι με άλλον boot-δίσκο) συν ότι πραγματικά βαριέμαι τώρα να το ψάξω στο Ίντερνετ, αλλά αν τα data type sizes τα ορίζει ως εύρη τιμών ή πλήθος bits (και όχι πλήθος bytes), τότε όντως μπορεί ο char να έχει ίδια bits με τον int (νόμιζα επίσης πως ορίζει ρητώς ότι ο char έχει fixed size, αντί για minimum size... κάτι που από ότι γράφετε δεν ισχύει). Αυτό που θυμάμαι (σχεδόν) σίγουρα είναι πως η τιμή επιστροφής της sizeof είναι σε bytes (με την ευρεία έννοια) ή για να είμαι πιο ακριβής σε unsigned-char units. Τώρα, το unsigned-char unit έχει CHAR_BIT bits. Άρα λοιπόν, υπάρχει ασυνέπεια στον τρόπο/ορολογία ορισμού μεταξύ data type sizes και τιμής επιστροφής της sizeof. Εξού και το μπλέξιμο! Ένα σημείο πάντως που χρειάζεται προσοχή όταν sizeof(char) == sizeof(int), είναι τι γίνεται με το stdio.h και πιο συγκεκριμένα με την τιμή του EOF π.χ στην fgetc(). Όταν sizeof(char) == sizeof(unsigned char) == sizeof(unsigned int) == sizeof(int) ΠΩΣ επηρεάζεται το εύρος τιμών του κάθε data type. Αν επιτρέπονται όλες οι τιμές, τότε υπάρχει θέμα με την τιμή του EOF η οποία δεν είναι representable στο conversion από unsigned char σε -1. Επίσης, θυμάμαι σίγουρα πως ο unsigned char πρέπει guaranteed να είναι ΧΩΡΙΣ padding bits, κάτι που δεν ισχύει για κανέναν άλλον τύπο (μπορούν να έχουν π.χ. trapping bits). Οπότε το τι γίνεται με το EOF, ο Θεός και η ψυχή του Γενικώς, φέξε μου και γλίστρησα δηλαδή. @ migf1: Καλός ο κώδικας σου. Ευανάγνωστος. Thanks. Ευχαριστώ κι εγώ, καλή συνέχεια.
imitheos Δημοσ. 17 Φεβρουαρίου 2015 Δημοσ. 17 Φεβρουαρίου 2015 Εφόσον ο int έχει μέγεθος 2 ή 4 "C bytes" γιατί η sizeof να είναι ίδια με αυτή του χαρακτήρα;Αν ο compiler υλοποιεί τον char με 16 bits τότε αυτό θα είναι 1 "C Byte". Αν και ο int υλοποιείται με 16bits τότε δεν θα έχει μέγεθος "2 ή 4 C bytes" αλλά 1. Αν εννοείς πως sizeof(char) == sizeof(int) δεν νομίζω να ισχύει πουθενά αυτό, διότι το πρότυπο απαιτεί ο char να είναι 1 byte ενώ ο int να είναι τουλάχιστον 2 bytes (με όσα bits κι αν έχει το byte). EDIT4: Α τώρα το είδα αυτό. Για αυτό ρώταγε ο gon. @imitheos, είσαι σίγουρος πως ισχύει αυτό; Εκτός πια αν μιλάς για non-compliant compilers. Γιατί θα πρέπει ο int να είναι τουλάχιστον 2 C Bytes ? Μην σκέφτεσαι με bytes γιατί μπερδεύεσαι. Το μόνο που μας νοιάζει είναι η τιμή. Ο int πρέπει να υποστηρίζει τουλάχιστον -32768 μέχρι 32767 δηλαδή χρειάζεται τουλάχιστον 16bits. Quiz: Τι θα επιστρέψει η sizeof(int) στις περιπτώσεις που CHAR_BIT είναι 8 και που είναι 16 ? Βασικά εγώ δεν είχα τέτοια απορία, γιατί δεν έχω ξανακούσει sizeof(char) == sizeof(int) σε compliant compiler. Δεν ξέρω κατά πόσο compliant είναι οι compilers αλλά πολλοί DSP χάριν απλότητας του hardware υλοποιούν τον char όπως και τον int. Σελίδα 122. Νομίζω το είχαμε αναλύσει παλαιότερα στο νήμα της C όπου είχαμε αναφέρει και τους Cray που είχανε διαφορετικά μεγέθη δεικτών ανάλογα με το σε τι τύπο δείχνουν
migf1 Δημοσ. 17 Φεβρουαρίου 2015 Δημοσ. 17 Φεβρουαρίου 2015 Μαζί γράφαμε ημίθεε (αν κι εγώ έγραφα σεντόνι πάλι). Το ξέρω πως υπάρχουν τέτοιες πλατφόρμες, αλλά νόμιζα πως δεν έχουν strict compliant compilers (ούτε τώρα είμαι σίγουρος δηλαδή).
gon1332 Δημοσ. 17 Φεβρουαρίου 2015 Δημοσ. 17 Φεβρουαρίου 2015 Quiz: Τι θα επιστρέψει η sizeof(int) στις περιπτώσεις που CHAR_BIT είναι 8 και που είναι 16 ? Αν ο int είναι 16 bits, τότε 2 και 1 αντίστοιχα. Τώρα το ξεκαθάρισα. Το πρόβλημά μου είναι πως το σκεφτόμουν με τα bytes και όχι με τα ranges. Μάθαμε και κάτι σήμερα! Το sizeof επιστρέφει "C bytes" ή όπως ανέφερε κι ο migf1, char units.
παπι Δημοσ. 17 Φεβρουαρίου 2015 Δημοσ. 17 Φεβρουαρίου 2015 Ξεχνας τα bits. και κανεις ovveride το char ως byte. Στο κατω κατω το char ειναι "λαθος" ως ονομο, εφοσον ο τυπος του character ειναι int και οχι char( blowmind )
migf1 Δημοσ. 17 Φεβρουαρίου 2015 Δημοσ. 17 Φεβρουαρίου 2015 Ξεχνας τα bits. και κανεις ovveride το char ως byte. Στο κατω κατω το char ειναι "λαθος" ως ονομο, εφοσον ο τυπος του character ειναι int και οχι char( blowmind ) Υποθέτω λέγοντας "override" εννοείς με typdef. Ισχύει, αλλά με unsigned char όχι με char. Επίσης, ειδικά στη C υπάρχουν φορές που θες να δουλέψεις έτσι κι αλλιώς με bits & bytes (οπότε o cross-platform τρόπος είναι: sizeof * CHAR_BIT, αν και όταν τα χρειάζεσαι το portability μάλλον είναι το τελευταίο που σε απασχολει). #gon: Ομοίως, unsigned char units (όχι char units, δεν είναι guaranteed unsigned o char).
Προτεινόμενες αναρτήσεις
Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε
Πρέπει να είστε μέλος για να αφήσετε σχόλιο
Δημιουργία λογαριασμού
Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!
Δημιουργία νέου λογαριασμούΣύνδεση
Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.
Συνδεθείτε τώρα