Διαστάσεις δεδομένων γ. Ποια είναι τα χαρακτηριστικά των τύπων δεδομένων κινητής υποδιαστολής; Ακέραιοι τύποι δεδομένων

Σε αυτό το μάθημα θα μάθετε Αλφάβητο γλώσσας C++, και επίσης τι τύπους δεδομένωντο πρόγραμμα μπορεί να το επεξεργαστεί. Αυτή μπορεί να μην είναι η πιο συναρπαστική στιγμή, αλλά αυτή η γνώση είναι απαραίτητη, επιπλέον, όταν αρχίσετε να μαθαίνετε οποιαδήποτε άλλη γλώσσα προγραμματισμού, θα περάσετε από ένα παρόμοιο στάδιο εκμάθησης με μεγαλύτερη αυτοπεποίθηση! Ένα πρόγραμμα C++ μπορεί να περιέχει τα ακόλουθα σύμβολα:

  • κεφαλαία, πεζά λατινικά γράμματα A, B, C..., x, y, z και κάτω παύλα.
  • Αραβικοί αριθμοί από 0 έως 9.
  • ειδικοί χαρακτήρες: ( ) , | , () + - / % * . \‘ : ?< > = ! & # ~ ; ^
  • χαρακτήρες διαστήματος, καρτέλας και νέας γραμμής.

Στη δοκιμή προγράμματος μπορείτε να χρησιμοποιήσετε σχόλια. Εάν το κείμενο περιέχει δύο κάθετους χαρακτήρες // και τελειώνει με χαρακτήρα νέας γραμμής ή περικλείεται μεταξύ των χαρακτήρων /* και */, τότε ο μεταγλωττιστής το αγνοεί.

Δεδομένα σε C++

Για την επίλυση ενός προβλήματος, οποιοδήποτε πρόγραμμα επεξεργάζεται ορισμένα δεδομένα. Μπορούν να είναι διαφόρων τύπων: ακέραιοι και πραγματικοί αριθμοί, χαρακτήρες, συμβολοσειρές, πίνακες. Στην C++, τα δεδομένα περιγράφονται συνήθως στην αρχή της συνάρτησης. ΠΡΟΣ ΤΗΝ βασικούς τύπους δεδομένωνοι γλώσσες περιλαμβάνουν:

Για τη δημιουργία άλλων τύπων δεδομένων, βασικών και λεγόμενων προσδιοριστές.Η C++ ορίζει τέσσερις προσδιοριστές τύπων δεδομένων:

  • σύντομη - σύντομη?
  • μακρύς - μακρύς?
  • υπογεγραμμένο - υπογεγραμμένο;
  • ανυπόγραφος - ανυπόγραφος.

Ακέραιος τύπος

Μεταβλητή τύπου ενθστη μνήμη του υπολογιστή μπορεί να καταλαμβάνει είτε 2 είτε 4 byte. Εξαρτάται από το μέγεθος bit του επεξεργαστή. Από προεπιλογή, όλοι οι τύποι ακεραίων θεωρούνται υπογεγραμμένοι, δηλαδή ο προσδιοριστής υπογεγραμμένοςμπορεί να μην προσδιορίζεται. Προσδιοριστής ανυπόγραφοσας επιτρέπει να αντιπροσωπεύετε μόνο θετικούς αριθμούς. Ακολουθούν ορισμένες περιοχές τιμών ακέραιου τύπου

Τύπος Εύρος Μέγεθος
ενθ -2147483648…2147483647 4 byte
ανυπόγραφο ενθ 0…4294967295 4 byte
υπογεγραμμένο ενθ -2147483648…2147483647 4 byte
σύντομη εσωτ -32768…32767 2 byte
μακρύς ενθ -2147483648…2147483647 4 byte
ανυπόγραφο σύντομο ενθ 0…65535 2 byte

Πραγματικός τύπος

Ένας αριθμός κινητής υποδιαστολής αναπαρίσταται με τη μορφή mE +- p, όπου m είναι το mantissa (ακέραιος ή κλασματικός αριθμός με υποδιαστολή), p είναι ο εκθέτης (ακέραιος). Τυπικές τιμές όπως φλοτέρκαταλαμβάνει 4 byte και διπλό 8 byte. Πίνακας εύρους πραγματικών τιμών:

φλοτέρ 3.4E-38…3.4E+38 4 byte
διπλό 1.7E-308…1.7E+308 8 byte
μακρύ διπλό 3.4E-4932…3.4E+4932 8 byte

Τύπος Boolean

Μεταβλητή τύπου boolμπορεί να πάρει μόνο δύο τιμές αλήθεια (αληθής ) ή ψεύτικο (ψέμα ). Οποιαδήποτε τιμή δεν είναι ίση με το μηδέν ερμηνεύεται ως αληθής.Εννοια ψευδήςαντιπροσωπεύεται στη μνήμη ως 0.

πληκτρολογήστε κενό

Το σύνολο τιμών αυτού του τύπου είναι κενό. Χρησιμοποιείται για τον ορισμό συναρτήσεων που δεν επιστρέφουν τιμή, για τον καθορισμό μιας κενή λίστας ορισμάτων συνάρτησης, ως τον βασικό τύπο για τους δείκτες και για τις λειτουργίες casting τύπου.

Μετατροπή τύπου δεδομένων

Στη C++, υπάρχουν δύο τύποι μετατροπής τύπων δεδομένων: ρητή και σιωπηρή.

  • Σιωπηρή μετατροπήσυμβαίνει αυτόματα. Αυτό γίνεται κατά τη σύγκριση, την ανάθεση ή την αξιολόγηση εκφράσεων διαφόρων τύπων. Για παράδειγμα, το παρακάτω πρόγραμμα θα εκτυπώσει στην κονσόλα μια τιμή όπως φλοτέρ

#include "stdafx.h" #include χρησιμοποιώντας namespace std? int main() ( int i=5; float f=10.12; cout<>άκυρο"); επιστροφή 0;)

#include "stdafx.h"

#περιλαμβάνω

χρησιμοποιώντας χώρο ονομάτων std ;

int main()

int i = 5 ; float f = 10,12 ;

cout<< i / f ;

σύστημα ("pause>>void" );

επιστροφή 0 ;

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

  • Ρητή μετατροπήσε αντίθεση με το σιωπηρό, πραγματοποιείται από τον προγραμματιστή. Υπάρχουν διάφοροι τρόποι για να κάνετε αυτήν τη μετατροπή:
  1. Μετατροπή σε στυλ ντο: (πλωτήρας) α
  2. Μετατροπή σε στυλ C++: φλοτέρ()

Η χύτευση τύπου μπορεί επίσης να πραγματοποιηθεί χρησιμοποιώντας τις ακόλουθες λειτουργίες:

static_cast<>() const_cast<>() reinterpret_cast<>() dynamic_cast<> ()

static_cast<> ()

const_cast<> ()

reinterpret_cast<> ()

dynamic_cast<> ()

static_cas- μετατρέπει σχετικούς τύπους δεδομένων. Αυτός ο τελεστής εκπέμπει τύπους σύμφωνα με τους συνήθεις κανόνες, οι οποίοι μπορεί να είναι απαραίτητοι όταν ο μεταγλωττιστής δεν εκτελεί αυτόματη μετατροπή. Η σύνταξη θα μοιάζει με αυτό:

Πληκτρολογήστε static_cast<Тип>(ένα αντικείμενο);

Χρησιμοποιώντας static_cast, δεν μπορείτε να αφαιρέσετε τη σταθερότητα από μια μεταβλητή, αλλά ο ακόλουθος τελεστής μπορεί να το κάνει. const_cast- χρησιμοποιείται μόνο όταν είναι απαραίτητο να αφαιρεθεί η σταθερότητα από ένα αντικείμενο. Η σύνταξη θα μοιάζει με αυτό:

Τύποςconst_cast< Τύπος> (ένα αντικείμενο);

reinterpret_cast- χρησιμοποιείται για τη μετατροπή διαφορετικών τύπων, ακέραιου σε δείκτη και αντίστροφα. Αν δείτε μια νέα λέξη "ευρετήριο" - μην ανησυχείτε! Αυτός είναι επίσης ένας τύπος δεδομένων, αλλά δεν θα συνεργαστούμε σύντομα με αυτόν. Η σύνταξη εδώ είναι η ίδια με αυτή των τελεστών που συζητήθηκαν προηγουμένως:

Τύποςεπανερμηνεύουν_εκμαγείο< Τύπος> (ένα αντικείμενο);

dynamic_cast- χρησιμοποιείται για δυναμική μετατροπή τύπου, υλοποιεί χύτευση δείκτη ή αναφοράς. Σύνταξη:

Τύποςδυναμικός _εκμαγείο< Τύπος> (ένα αντικείμενο);

Χαρακτήρες ελέγχου

Είστε ήδη εξοικειωμένοι με μερικούς από αυτούς τους «χαρακτήρες ελέγχου» (για παράδειγμα, \n). Όλα ξεκινούν με ανάστροφη κάθετο και περιβάλλονται επίσης από διπλά εισαγωγικά.

Εικόνα

Hex κωδικός

Ονομα

Ήχος Beeper

Πήγαινε ένα βήμα πίσω

Μετάφραση σελίδας (μορφή)

Γραμμική μετάφραση

Επιστροφή άμαξα

Οριζόντιος πίνακας

Κάθετη καρτέλα

Ένας τύπος δεδομένων ορίζει ένα σύνολο τιμών, ένα σύνολο πράξεων που μπορούν να εφαρμοστούν σε αυτές τις τιμές και πώς αποθηκεύονται οι τιμές και εκτελούνται οι λειτουργίες.

Η διαδικασία ελέγχου και επιβολής περιορισμών στους τύπους των δεδομένων που χρησιμοποιούνται ονομάζεται έλεγχος τύπου ή πληκτρολόγηση δεδομένων προγράμματος. Διακρίνονται οι ακόλουθοι τύποι πληκτρολόγησης:

  • Στατική πληκτρολόγηση - ο έλεγχος τύπου εκτελείται κατά τη μεταγλώττιση.
  • Δυναμική πληκτρολόγηση - ο έλεγχος τύπου πραγματοποιείται κατά το χρόνο εκτέλεσης.

Η γλώσσα C υποστηρίζει στατική πληκτρολόγηση και οι τύποι όλων των δεδομένων που χρησιμοποιούνται σε ένα πρόγραμμα πρέπει να καθοριστούν πριν από τη μεταγλώττιση του.

Υπάρχουν απλοί, σύνθετοι και άλλοι τύποι δεδομένων.

Απλά δεδομένα

Τα απλά δεδομένα μπορούν να χωριστούν σε

  • ακέραιοι,
  • πραγματικός,
  • συμβολικός
  • σπαζοκεφαλιά.

Σύνθετα (σύνθετα) δεδομένα

  • Ένας πίνακας είναι μια ευρετηριασμένη συλλογή στοιχείων του ίδιου τύπου.
  • Ο τύπος συμβολοσειράς είναι ένας πίνακας που αποθηκεύει μια συμβολοσειρά χαρακτήρων.
  • Η δομή είναι ένα σύνολο από διάφορα στοιχεία (πεδία εγγραφής), που αποθηκεύονται ως ενιαίο σύνολο και παρέχουν πρόσβαση σε μεμονωμένα πεδία της δομής.

Άλλοι τύποι δεδομένων

  • Δείκτης - αποθηκεύει μια διεύθυνση στη μνήμη του υπολογιστή που οδηγεί σε ορισμένες πληροφορίες, συνήθως έναν δείκτη σε μια μεταβλητή.

Ένα πρόγραμμα γραμμένο σε γλώσσα C λειτουργεί με δεδομένα διαφόρων τύπων. Όλα τα δεδομένα έχουν όνομα και τύπο. Η πρόσβαση στα δεδομένα του προγράμματος γίνεται με τα ονόματά τους (αναγνωριστικά).

Ένα αναγνωριστικό είναι μια ακολουθία που δεν περιέχει περισσότερους από 32 χαρακτήρες, η οποία μπορεί να περιλαμβάνει οποιαδήποτε γράμματα του λατινικού αλφαβήτου a - z, A - Z, τους αριθμούς 0 - 9 και την κάτω παύλα (_). Ο πρώτος χαρακτήρας του αναγνωριστικού δεν πρέπει να είναι αριθμός.

Αν και επιτρέπεται ένα όνομα έως και 32 χαρακτήρων, μόνο οι πρώτοι 8 χαρακτήρες είναι σημαντικοί. Εκτός από το όνομα, όλα τα δεδομένα έχουν έναν τύπο. Ο καθορισμός του τύπου είναι απαραίτητος ώστε να είναι γνωστό πόσο χώρο στη μνήμη RAM θα ​​καταλάβει το συγκεκριμένο αντικείμενο.

Ο μεταγλωττιστής C ακολουθεί αυστηρή αντιστοίχιση κεφαλαίων και πεζών γραμμάτων στα ονόματα των αναγνωριστικών και των διακριτικών.

Ακέραια δεδομένα

Τα ακέραια δεδομένα μπορούν να αναπαρασταθούν σε υπογεγραμμένη ή ανυπόγραφη μορφή.

Ανυπόγραφοι Ακέραιοιαντιπροσωπεύονται ως μια ακολουθία bit στην περιοχή από 0 έως 2 n -1, όπου n είναι ο αριθμός των κατειλημμένων bit.

Υπογεγραμμένοι ακέραιοι αριθμοίαντιπροσωπεύονται στην περιοχή -2 n-1 …+2 n-1 -1. Σε αυτήν την περίπτωση, το πιο σημαντικό bit των δεδομένων εκχωρείται στο πρόσημο του αριθμού (0 αντιστοιχεί σε θετικό αριθμό, 1 σε αρνητικό).

Βασικοί τύποι και μεγέθη ακέραιων δεδομένων:

Πραγματικά δεδομένα

Πραγματικός τύποςπροορίζεται να αναπαραστήσει πραγματικούς αριθμούς. Οι πραγματικοί αριθμοί αναπαρίστανται στο πλέγμα bit του μηχανήματος σε τυποποιημένη μορφή.

Κανονοποιημένη μορφή αριθμούπροϋποθέτει την παρουσία ενός σημαντικού αριθμού (όχι 0) πριν από το διαχωρισμό του ακέραιου και του κλασματικού μέρους. Αυτή η αναπαράσταση πολλαπλασιάζεται με τη βάση του συστήματος αριθμών στον κατάλληλο βαθμό. Για παράδειγμα, ο αριθμός 12345.678 σε κανονικοποιημένη μορφή μπορεί να αναπαρασταθεί ως

12345.678 = 1.2345678 10 4

Ο αριθμός 0,009876 σε κανονικοποιημένη μορφή μπορεί να αναπαρασταθεί ως

0,009876 = 9,876·10 -3

Στο δυαδικό σύστημα αριθμών, το σημαντικό ψηφίο πριν από το δεκαδικό διαχωριστικό μπορεί να είναι μόνο ίσο με 1. Εάν ο αριθμός δεν μπορεί να αναπαρασταθεί σε τυποποιημένη μορφή (για παράδειγμα, ο αριθμός 0), το σημαντικό ψηφίο πριν από το δεκαδικό διαχωριστικό είναι 0.

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

Στη γενική περίπτωση, ένας πραγματικός αριθμός στο πλέγμα bit ενός υπολογιστή μπορεί να αναπαρασταθεί ως 4 πεδία.

  • σημάδι— ένα bit που καθορίζει το πρόσημο ενός πραγματικού αριθμού (0 για θετικούς αριθμούς, 1 για αρνητικούς αριθμούς).
  • βαθμός— καθορίζει την ισχύ του 2 με την οποία θέλετε να πολλαπλασιάσετε έναν αριθμό σε κανονικοποιημένη μορφή. Δεδομένου ότι η ισχύς του 2 για έναν αριθμό σε κανονικοποιημένη μορφή μπορεί να είναι είτε θετική είτε αρνητική, η μηδενική ισχύς του 2 στην αναπαράσταση ενός πραγματικού αριθμού αντιστοιχεί σε μια τιμή μετατόπισης, η οποία ορίζεται ως

    όπου n είναι ο αριθμός των ψηφίων που εκχωρούνται για να αναπαραστήσουν την ισχύ ενός αριθμού.

  • ολόκληρος- ένα bit που είναι πάντα ίσο με 1 για κανονικοποιημένους αριθμούς, επομένως σε ορισμένες αναπαραστάσεις τύπου αυτό το bit παραλείπεται και θεωρείται ότι είναι ίσο με 1.
  • μάντισσα— σημαντικά ψηφία της αναπαράστασης ενός αριθμού, που βρίσκονται μετά το διαχωριστικό του ακέραιου και των κλασματικών μερών σε τυποποιημένη μορφή.

Υπάρχουν τρεις κύριοι τύποι αναπαράστασης πραγματικών αριθμών στη γλώσσα C:

Όπως φαίνεται από τον πίνακα, οι τύποι float και double δεν έχουν ακέραιο bit. Σε αυτή την περίπτωση, το εύρος αναπαράστασης ενός πραγματικού αριθμού αποτελείται από δύο περιοχές που βρίσκονται συμμετρικά σε σχέση με το μηδέν. Για παράδειγμα, το εύρος αναπαράστασης των αριθμών float μπορεί να αναπαρασταθεί ως:

Παράδειγμα: Αντιπροσωπεύστε τον αριθμό -178.125 σε ένα πλέγμα 32 bit (τύπος float).

Για να αναπαραστήσουμε έναν αριθμό στο δυαδικό σύστημα αριθμών, μετασχηματίζουμε τα ακέραια και τα κλασματικά μέρη χωριστά:

178 10 = 10110010 2 .

0,125 10 = 0,001 2 .

178.125 10 = 10110010.001 2 =1.0110010001 2 111

Για μετατροπή σε κανονικοποιημένη φόρμα, μετακινήστε 7 bit προς τα αριστερά).

Για να προσδιορίσετε τη δύναμη ενός αριθμού, χρησιμοποιήστε μια μετατόπιση:

0111111+00000111 = 10000110 .

Έτσι, ο αριθμός -178.125 θα αναπαρασταθεί στο πλέγμα bit ως

Τύπος χαρακτήρα

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

Τύπος Boolean

Ο τύπος Boolean χρησιμοποιείται σε λογικές πράξεις, χρησιμοποιείται σε δοκιμές αλγοριθμικών συνθηκών και σε βρόχους και έχει δύο έννοιες:

  • αλήθεια αλήθεια
  • ψευδής — — ψευδής

Το πρόγραμμα πρέπει να δηλώσει όλα τα δεδομένα που χρησιμοποιούνται, υποδεικνύοντας το όνομα και τον τύπο του. Μια περιγραφή των δεδομένων πρέπει να προηγείται της χρήσης τους στο πρόγραμμα.

Παράδειγμα δήλωσης αντικειμένου

int n; // Μεταβλητή n ακέραιου τύπου
διπλό α? // Μεταβλητή a πραγματικού τύπου διπλής ακρίβειας

Απάντηση:
  1. Ακέραιοι τύποι δεδομένων:

σύντομη εντ, ανυπόγραφη σύντομη μεσαία, ανυπόγραφη, μακρά, ανυπόγραφη μακρά.

  1. Τύποι δεδομένων κινητής υποδιαστολής (που αντιστοιχούν σε πραγματικούς τύπους):

float, double, long double.

  1. Τύπος δεδομένων χαρακτήρων:

char (υπογεγραμμένο char), ανυπόγραφο char, wchar_t.

  1. Τύπος δεδομένων Boole:

bool.

  1. Απαριθμημένος τύπος δεδομένων (παρουσιάστηκε στο Visual C++):

αρίθμηση.

2. Ποια είναι τα χαρακτηριστικά της χρήσης τύπων δεδομένων ακεραίων;

Στην C++, οι κύριοι τύποι δεδομένων ακεραίων είναι: short int, unsigned short int, int, unsigned int, long (long int), unsigned long (unsigned long int).

Αυτοί οι τύποι δεδομένων αντιπροσωπεύουν τιμές από ένα σύνολο ακεραίων αριθμών. Για παράδειγμα:

2 -100 398

Οι τύποι δεδομένων που ξεκινούν με το ανυπόγραφο πρόθεμα μπορούν να περιέχουν μόνο θετικούς αριθμούς.

Τα δεδομένα του τύπου short int, unsigned short int καταλαμβάνουν το μισό χώρο στη μνήμη από τα δεδομένα του τύπου int, unsigned int.

Τα δεδομένα τύπου long, unsigned long καταλαμβάνουν διπλάσιο χώρο μνήμης από τα δεδομένα τύπου int, unsigned int.

3. Πώς να περιγράψετε μια μεταβλητή με το όνομα x ακέραιου τύπου σε ένα πρόγραμμα;

Απάντηση:
int x; // υπογεγραμμένος ακέραιος

Ως αποτέλεσμα, κάτω από τη μεταβλητή Χθα εκχωρηθεί χώρος μνήμης 4 byte. Το μέγεθος της μνήμης που εκχωρείται για μια μεταβλητή εξαρτάται από τα χαρακτηριστικά του υπολογιστή, τον τύπο του λειτουργικού συστήματος και τις ρυθμίσεις του μεταγλωττιστή.

4. Πώς να γράψετε τον αριθμό 239 σε μια μεταβλητή ακέραιου τύπου;

Για να το κάνετε αυτό, χρησιμοποιήστε τον τελεστή εκχώρησης, ο οποίος συμβολίζεται με το σύμβολο «=».

Απάντηση 1.Εισαγωγή αριθμού σε μια μεταβλητή μετά την περιγραφή της.

int x; x = 239;

Απάντηση 2.Εισαγωγή αριθμού σε μια μεταβλητή κατά την περιγραφή της (αρχική προετοιμασία).

int x = 239;

5. Ποια είναι τα χαρακτηριστικά των τύπων δεδομένων κινητής υποδιαστολής;

Οι τύποι δεδομένων κινητής υποδιαστολής σάς επιτρέπουν να αντιπροσωπεύετε τιμές από ένα σύνολο πραγματικών αριθμών. Για παράδειγμα:

8.35 -990.399 239.0.

Η C++ έχει τους ακόλουθους βασικούς τύπους δεδομένων κινητής υποδιαστολής:

float, double, long double.

Μια μεταβλητή τύπου double καταλαμβάνει 2 φορές περισσότερο χώρο στη μνήμη του υπολογιστή από μια μεταβλητή τύπου float.

Επίσης, μια μεγάλη μεταβλητή διπλού τύπου καταλαμβάνει 2 φορές περισσότερο χώρο στη μνήμη του υπολογιστή από μια μεταβλητή διπλού τύπου.

6. Πώς να περιγράψετε μια μεταβλητή που παίρνει τιμή κινητής υποδιαστολής;

Ένα παράδειγμα περιγραφής μεταβλητών των τύπων float, double, long double:

float f; διπλό d? μακρύ διπλό ld?

7. Πώς να γράψετε αριθμητικές τιμές σε μια μεταβλητή κινητής υποδιαστολής;

Ένα παράδειγμα εισαγωγής αριθμητικών δεδομένων σε μεταβλητές κινητής υποδιαστολής:

float f = -9928,45; // αρχική προετοιμασία διπλό d? μακρύ διπλό ld? d = 0,445332; // τελεστής εκχώρησης ld = 3892923898239.030903; // τελεστής εκχώρησης

8. Πώς να μετατρέψετε μια μεταβλητή float σε τύπο int;

Για να γίνει αυτό, χρησιμοποιείται η λειτουργία χύτευσης τύπου. Σε παρένθεση πρέπει να υποδείξετε το όνομα του τύπου στον οποίο μεταδίδεται το καστ.

επιπλέω α? int b; a = 8,457; b = (int ) a; // b = 8

Όταν χρησιμοποιείτε λειτουργίες casting τύπου, πρέπει να λάβετε υπόψη τους περιορισμούς που ισχύουν για τύπους που καταλαμβάνουν λιγότερο χώρο στη μνήμη του υπολογιστή.

Για παράδειγμα, μια μεταβλητή τύπου short int μπορεί να αντιπροσωπεύει μικρότερο εύρος αριθμών από μεταβλητές τύπου float ή double. Η ακόλουθη λίστα υπερχειλίζει μια τιμή σε μια μεταβλητή τύπου short int :

σύντομη int i? float f; f = 3990099,8; i = (int )f; // i = -7597 - υπερχείλιση

9. Πώς να μετατρέψετε μια μεταβλητή από type int σε type double;

Παράδειγμα casting από int σε double:

int i? διπλό d? i = 982; d = (διπλό)i; // d = 982,0

10. Ποια είναι τα χαρακτηριστικά της χρήσης δεδομένων χαρακτήρων (δεδομένων χαρακτήρων) σε ένα πρόγραμμα;

Τα δεδομένα τύπου char αντιπροσωπεύουν την τιμή χαρακτήρων του κωδικού που εισάγεται από το πληκτρολόγιο. Ο κωδικός συμβόλου είναι ακέραιος.

Για παράδειγμα, ο κωδικός για τον χαρακτήρα «f» είναι 102.

Ένα τμήμα κώδικα που υπολογίζει τον κωδικό χαρακτήρα:

κωδικός int? σύμβολο char? σύμβολο = "f" ; κωδικός = (int )symbol; // κωδικός = 102

Τα δεδομένα του τύπου char είναι οι ίδιοι ακέραιοι. Τα δεδομένα τύπου char καταλαμβάνουν 1 byte στη μνήμη του υπολογιστή.

Η σχέση χαρακτήρα προς κώδικα βρίσκεται στον πίνακα συμβόλων των Windows. Οι χαρακτήρες με κωδικούς από 0 έως 127 είναι δεσμευμένοι χαρακτήρες BIOS. Περιλαμβάνουν τα πιο συχνά χρησιμοποιούμενα σύμβολα, αριθμητικά σύμβολα και λατινικά σύμβολα. Αυτοί οι χαρακτήρες δεν μπορούν να αλλάξουν.

Οι χαρακτήρες με κωδικούς από 128 έως 255 είναι τοπικοί χαρακτήρες που συνδέονται με ένα συγκεκριμένο αλφάβητο του υπολογιστή στον οποίο είναι εγκατεστημένο το λειτουργικό σύστημα Windows.

11. Ποια είναι τα χαρακτηριστικά της χρήσης τύπου δεδομένων bool (λογικός τύπος);

Οι μεταβλητές τύπου bool μπορούν να λάβουν μόνο δύο τιμές:

αληθινή αλήθεια,

ψευδής - ψευδής.

Αυτές οι μεταβλητές χρησιμοποιούνται για τον έλεγχο Boolean εκφράσεων. Η αριθμητική τιμή του true είναι 1. Η αριθμητική τιμή του false είναι 0.

Απόσπασμα κώδικα που ορίζει τις αριθμητικές τιμές true και false:

int αποτέλεσμα? bool b; αποτέλεσμα = (in)true; // αποτέλεσμα = 1 b = ψευδής ; αποτέλεσμα = (int )b; // αποτέλεσμα = 0

Απόσπασμα κώδικα που μετατρέπει τύπους int και float σε bool:

int i? float f; bool b; i = 6; b = (bool )i; // b = Σωστό f = 0,0; b = (bool )f; // b = Λάθος

12. Πώς να προσδιορίσετε το μέγεθος της μνήμης που καταλαμβάνει μια μεταβλητή ενός δεδομένου τύπου;

Η λειτουργία sizeof() χρησιμοποιείται για αυτό.

Ένα απόσπασμα κώδικα που καθορίζει το μέγεθος ορισμένων τύπων δεδομένων:

int d; d = sizeof(char); // d = 1 d = sizeof(unsigned int); // d = 4 d = sizeof(float); // d = 4 d = μέγεθος (διπλό); // d = 8

13. Πώς αρχικοποιούνται οι μεταβλητές διαφορετικών τύπων;

int d = 28; float z = (float )2,85; char c = "k" ; String ^s = "Γεια!" ; διπλό r = -8,559;

14. Πώς προσδιορίζεται η μέγιστη επιτρεπτή (ελάχιστη επιτρεπτή) τιμή μιας μεταβλητής συγκεκριμένου τύπου;

Για να προσδιορίσετε τη μέγιστη ή την ελάχιστη τιμή για μια μεταβλητή συγκεκριμένου τύπου, η βιβλιοθήκη .NET Framework χρησιμοποιεί τις ιδιότητες MaxValue και MinValue.

Παραδείγματα καθορισμού οριακών τιμών μεταβλητών διαφορετικών τύπων.

Για μεταβλητές τύπου int :

// πληκτρολογήστε int int i? μακρύ MaxInt; long MinInt; MaxInt = (long )i.MaxValue; // MaxInt = 2147483647 MinInt = (long )i.MinValue; // MinInt = -2147483648

Για μεταβλητές τύπου short int :

// πληκτρολογήστε short int σύντομη int si? int MaxInt; int MinInt; MaxInt = (int )si.MaxValue; // MaxInt = 32767 MinInt = (int )si.MinValue; // MinInt = -32768

Για μεταβλητές τύπου unsigned int :

// πληκτρολογήστε unsigned int ανυπόγραφο int ui? ανυπόγραφο int MaxInt; ανυπόγραφο int MinInt; MaxInt = ui.MaxValue; // MaxInt = 4294967295 MinInt = ui.MinValue; // MinInt = 0

Για float μεταβλητές:

// τύπος float float f; float MaxF; float MinF; MaxF = f.MaxValue; // MaxF = 3,402823E+38 MinF = f.MinValue; // MinF = -3,402823E+38

Για μεταβλητές τύπου double:

// πληκτρολογήστε διπλό διπλό d? διπλό MaxD? διπλό μυαλό? Max = d.MaxValue; // Μέγιστο = 1,79769313486232E+308 Ελάχιστη = d.MinValue; // Ελάχ. = -1,79769313486232E+308

Για μεταβλητές τύπου char:

// πληκτρολογήστε char char c; int MaxC; int MinC; Max = (int )c.MaxValue; // Μέγιστο = 127 Ελάχιστη = (int )c.MinValue; // Ελάχ. = -128

15. Ποια είναι τα χαρακτηριστικά της χρήσης του τύπου enum;

Ο τύπος enum είναι ένας τύπος δεδομένων απαρίθμησης. Καθορίζει μνημονικές τιμές για σύνολα ακέραιων τιμών. Κάθε μνημονική τιμή έχει συγκεκριμένο περιεχόμενο και αντιπροσωπεύεται από έναν ακέραιο.

Ένα παράδειγμα χρήσης του τύπου enum για την αναπαράσταση μηνών του έτους:

πολλούς μήνες (Ιανουάριος, Φεβρουάριος, Μάρτιος, Απρίλιος, Μάιος, Ιούνιος, Ιούλιος, Αυγούστου, Σεπτεμβρίου, Οκτωβρίου, Νοεμβρίου, Δεκεμβρίου) mn; mn = Ιανουάριος; // mn = 0 mn = Μάρτιος; // mn = 2 mn = Σεπτέμβριος; // mn = 8

Το παρακάτω παράδειγμα περιγράφει μια μεταβλητή με το όνομα mn τύπου enum μήνες. Οι μνημονικές τιμές για μήνες (Ιανουάριος, Φεβρουάριος, ...) ξεκινούν από 0 (0, 1, 2, ...). Η μνημονική του Ιανουαρίου είναι η ακέραια τιμή 0, η μνημονική του Φεβρουαρίου είναι η ακέραια τιμή 1 και ούτω καθεξής.

Έτσι, χρησιμοποιώντας τον τύπο enum, τα μνημονικά μπορούν να χρησιμοποιηθούν στο κείμενο του προγράμματος για καλύτερη σαφήνεια του πηγαίου κώδικα.

Μπορείτε επίσης να το γράψετε ως εξής:

mn = (αριθμοί μήνες)2; // mn = Μάρτιος mn = (αριθμοί μήνες)11; // mn = Δεκέμβριος

16. Ποια είναι τα χαρακτηριστικά του τύπουκενός σε προγράμματα γιαντο++ ?

Ο τύπος κενού δεδομένων χρησιμοποιείται στις ακόλουθες περιπτώσεις:

  • εάν χρειάζεται να περιγράψετε μια συνάρτηση που δεν επιστρέφει καμία τιμή (βλ. παράδειγμα).
  • εάν χρειάζεται να περιγράψετε μια συνάρτηση που δεν λαμβάνει παραμέτρους (βλ. παράδειγμα).

Παράδειγμα. Η MyFun() είναι μια συνάρτηση χωρίς παραμέτρους που δεν επιστρέφει τιμή (επιστρέφει τον τύπο void ) και δεν λαμβάνει παραμέτρους.

δημόσιο : void MyFun(void ) { // σώμα λειτουργίας // ... ΕΠΙΣΤΡΟΦΗ; // επιστροφή από μια συνάρτηση που δεν επιστρέφει τιμή } // κλήση μιας συνάρτησης από το πρόγραμμα ... MyFun(); ...

17. Είναι δυνατή η δήλωση μεταβλητής τύπουκενός σε πρόγραμμα;

Αυτό δεν είναι δυνατό επειδή ο τύπος κενού δεν συσχετίζεται με μια τιμή.

Η δήλωση μιας μεταβλητής τύπου άκυρη οδηγεί σε σφάλμα μεταγλώττισης με το ακόλουθο μήνυμα:

"Παράνομη χρήση τύπου void"

18. Ποια είναι τα χαρακτηριστικά του τύπουwchar_ t VΟπτικός ντο++ ?

Μεταβλητές τύπου char (δείτε προηγούμενες παραγράφους) χρησιμοποιούνται για την αποθήκευση χαρακτήρων ASCII 8-bit.

Ο τύπος wchar_t χρησιμοποιείται για την αποθήκευση χαρακτήρων που αποτελούν μέρος μεγάλων συνόλων χαρακτήρων. Για παράδειγμα, το κινέζικο αλφάβητο έχει τεράστιο αριθμό χαρακτήρων. Τα 8 ψηφία δεν είναι αρκετά για να αντιπροσωπεύσουν ολόκληρο το σύνολο των κινεζικών χαρακτήρων. Επομένως, εάν χρειάζεται να χρησιμοποιήσετε το πρόγραμμα στη διεθνή αγορά, καλό είναι να αντικαταστήσετε τον τύπο char με wchar_t.

Παράδειγμαχρησιμοποιώντας τον τύπο wchar_t.

... wchar_t t; // 2 byte μνήμης εκχωρούνται για τη μεταβλητή t t = "s"; ...

Εκτός από τη διαίρεση των δεδομένων σε μεταβλητές και σταθερές, υπάρχει και ταξινόμηση των δεδομένων ανά τύπο. Η περιγραφή των μεταβλητών συνίσταται κυρίως στη δήλωση του τύπου τους. Ο τύπος δεδομένων χαρακτηρίζει το εύρος των τιμών του και τη μορφή αναπαράστασης στη μνήμη του υπολογιστή. Κάθε τύπος χαρακτηρίζεται από ένα σύνολο λειτουργιών που εκτελούνται σε δεδομένα. Παραδοσιακά, οι γλώσσες προγραμματισμού γενικής χρήσης έχουν τυπικούς τύπους όπως ακέραιος, πραγματικός, χαρακτήρας και λογικός 3 . Ας σημειώσουμε αμέσως ότι δεν υπάρχει λογικός τύπος στο C. Μια έκφραση (στη συγκεκριμένη περίπτωση, μια μεταβλητή) θεωρείται αληθής εάν είναι μη μηδενική, διαφορετικά θεωρείται ψευδής.

Η ύπαρξη δύο αριθμητικών τύπων (ακέραιος και πραγματικός) συνδέεται με δύο πιθανές μορφές αναπαράστασης αριθμών στη μνήμη του υπολογιστή.

Δεδομένα ολόκληρου τύπουαποθηκεύεται σε μορφή παρουσίασης σταθερό σημείο. Χαρακτηρίζεται από απόλυτη ακρίβεια στην αναπαράσταση αριθμών και στην εκτέλεση πράξεων σε αυτούς, καθώς και από περιορισμένο εύρος τιμών αριθμών. Ο ακέραιος τύπος χρησιμοποιείται για δεδομένα που, καταρχήν, δεν μπορούν να έχουν κλασματικό μέρος (αριθμός ατόμων, αυτοκίνητα κ.λπ., αριθμοί και μετρητές).

Πληκτρολογήστε πραγματικόαντιστοιχεί στη μορφή αναπαράστασης αριθμού κινητής υποδιαστολής, η οποία χαρακτηρίζεται από μια κατά προσέγγιση αναπαράσταση ενός αριθμού με δεδομένο αριθμό σημαντικών ψηφίων (σύμβολα mantissa) και ένα μεγάλο εύρος της τάξης του αριθμού, που καθιστά δυνατή την αναπαράσταση τόσο μεγάλων όσο και πολύ μικρών αριθμών σε απόλυτη τιμή. Λόγω της κατά προσέγγιση αναπαράστασης δεδομένων πραγματικού τύπου, τους είναι λάθος να γίνεται σύγκριση για ισότητα.

Στις σύγχρονες υλοποιήσεις καθολικών γλωσσών προγραμματισμού, υπάρχουν συνήθως αρκετοί ακέραιοι και αρκετοί πραγματικοί τύποι, καθένας από τους οποίους χαρακτηρίζεται από το μέγεθος της μνήμης που εκχωρείται για μια τιμή και, κατά συνέπεια, το εύρος των τιμών του αριθμού και για τους πραγματικούς τύπους - και την ακρίβειά του (ο αριθμός των ψηφίων της μάντισσας).

Δεδομένα τύπος χαρακτήραλαμβάνουν τιμές σε ολόκληρο το σύνολο χαρακτήρων που επιτρέπονται για έναν δεδομένο υπολογιστή. Ένα byte εκχωρείται για την αποθήκευση μιας τιμής χαρακτήρων που κωδικοποιούνται σύμφωνα με έναν τυπικό πίνακα κωδικοποίησης (συνήθως ASCII).

Υπάρχουν 4 βασικοί τύποι στο C:

απανθρακώνω- τύπος χαρακτήρα.

ενθ- ολόκληρος τύπος,

φλοτέρ- ενιαίο πραγματικό τύπο ακριβείας,

διπλό- διπλής ακρίβειας πραγματικός τύπος.

Για να ορίσετε παραγόμενους τύπους, χρησιμοποιήστε προκριματικά:μικρός(κοντό) - χρησιμοποιείται με τύπο ενθ,μακρύς(μακρύ) - χρησιμοποιείται με τύπους ενθΚαι διπλό;υπογεγραμμένος(με πινακίδα), ανυπόγραφο(ανυπόγραφο) - ισχύει για οποιονδήποτε ακέραιο τύπο. Σε περίπτωση απουσίας της λέξης ανυπόγραφη, η τιμή θεωρείται υπογεγραμμένη, δηλ. δηλ. υπογράφεται η προεπιλογή. Λόγω του παραδεκτού ενός αυθαίρετου συνδυασμού χαρακτηριστικών και ονομάτων βασικών τύπων, ένας τύπος μπορεί να έχει πολλές ονομασίες. Πληροφορίες σχετικά με τους τυπικούς τύπους C παρουσιάζονται στους Πίνακες 1 και 2. Οι περιγραφείς συνωνύμων παρατίθενται στα κελιά της πρώτης στήλης, διαχωρισμένοι με κόμμα.

Πίνακας 1. Τυπικοί ακέραιοι τύποι δεδομένων C

Τύπος δεδομένων

Εύρος τιμών

char, υπογεγραμμένο char

ανυπόγραφος int, ανυπόγραφος

int, υπογεγραμμένο int, short int, short

2147483648...2147483647

Είναι ενδιαφέρον ότι στο C, ο τύπος char μπορεί να χρησιμοποιηθεί ως χαρακτήρας ή ως ακέραιος τύπος, ανάλογα με το περιβάλλον.

Πίνακας 2. Τυπικοί τύποι πραγματικών δεδομένων Γ

Σχόλιο.Για να γράψουμε προγράμματα για το πρώτο μέρος του εγχειριδίου, θα χρειαστούμε κυρίως δύο είδη:φλοτέρΚαιενθ.

Σε αυτό το μάθημα θα εξετάσουμε ακέραιους τύπους δεδομένων, εύρη τιμών, διαίρεση και υπερχείλιση: τι είναι και παραδείγματα.

Ακέραιοι τύποι δεδομένων

Ακέραιος τύπος δεδομένωνείναι ένας τύπος του οποίου οι μεταβλητές μπορούν να περιέχουν μόνο ακέραιους αριθμούς (χωρίς κλασματικό μέρος, για παράδειγμα: -2, -1, 0, 1, 2). Στη C++ υπάρχουν πέντε βασικοί τύποι ακεραίων που είναι διαθέσιμοι για χρήση:

Σημείωση: Ο τύπος char είναι μια ειδική περίπτωση, είναι τόσο ακέραιος όσο και τύπος δεδομένων χαρακτήρων. Θα μιλήσουμε για αυτό με περισσότερες λεπτομέρειες σε ένα από τα παρακάτω μαθήματα.

Η κύρια διαφορά μεταξύ των παραπάνω ακέραιων τύπων είναι ότι όσο μεγαλύτερος είναι, τόσο περισσότερες τιμές μπορεί να αποθηκεύσει μια μεταβλητή αυτού του τύπου.

Ορισμός ακέραιων μεταβλητών

Συμβαίνει ως εξής:

char c; σύντομη int si? // αποδεκτό κοντό s; // προτιμότερο int i; long int li? // έγκυρο μακρύ l; // κατά προτίμηση long long int lli; // valid long long ll; // προτιμότερος

Ενώ μπορούν να χρησιμοποιηθούν τα πλήρη ονόματα short int , long int και long long int, οι συντομευμένες εκδόσεις τους (χωρίς int) προτιμώνται για χρήση. Επιπλέον, η συνεχής προσθήκη ints καθιστά τον κώδικα δυσανάγνωστο (μπερδεύεται εύκολα με μια μεταβλητή).

Εύρος τιμών και πρόσημο ακέραιων τύπων δεδομένων

Όπως ήδη γνωρίζετε από το προηγούμενο μάθημα, μια μεταβλητή με n αριθμό bit μπορεί να αποθηκεύσει 2n πιθανές τιμές. Ποιες είναι όμως αυτές οι έννοιες; Αυτά που βρίσκονται εντός εμβέλειας. Εύρος- αυτές είναι οι τιμές από και προς τις οποίες μπορεί να αποθηκεύσει ένας συγκεκριμένος τύπος δεδομένων. Το εύρος μιας ακέραιας μεταβλητής καθορίζεται από δύο παράγοντες: το μέγεθός της (σε bit) και το μέγεθος της σημάδι(που μπορεί να είναι υπογεγραμμένοςή ανυπόγραφο).

υπογεγραμμένος(υπογραφή) σημαίνει ότι η μεταβλητή μπορεί να περιέχει θετικούς και αρνητικούς αριθμούς. Για να δηλώσετε μια μεταβλητή ως υπογεγραμμένη, χρησιμοποιήστε τη λέξη-κλειδί υπογεγραμμένος:

υπογεγραμμένο char c; υπογεγραμμένο σύντομο s? υπογεγραμμένο int i; υπογεγραμμένο μακρύ l? υπογεγραμμένο μακρύ μακρύ ll?

υπογεγραμμένο char c ;

υπογεγραμμένο σύντομο s ;

υπογεγραμμένο int i ;

υπογεγραμμένο μακρύ l ;

υπογεγραμμένο μακρύ μακρύ ll?

Από προεπιλογή, η υπογεγραμμένη λέξη-κλειδί γράφεται πριν από τον τύπο δεδομένων.

Μια ακέραια μεταβλητή με υπογραφή 1 byte έχει εύρος τιμών από -128 έως 127. Οποιαδήποτε τιμή από -128 έως 127 (συμπεριλαμβανομένου) μπορεί να αποθηκευτεί με ασφάλεια σε αυτήν.

Σε ορισμένες περιπτώσεις, μπορούμε να γνωρίζουμε εκ των προτέρων ότι οι αρνητικοί αριθμοί δεν θα χρησιμοποιηθούν στο πρόγραμμα. Αυτό είναι πολύ συνηθισμένο όταν χρησιμοποιείτε μεταβλητές για την αποθήκευση της ποσότητας ή του μεγέθους κάποιου πράγματος (για παράδειγμα, το ύψος ή το βάρος σας δεν μπορεί να είναι αρνητικό). Ακέραιος τύπος ανυπόγραφο(ανυπόγραφο) μπορεί να περιέχει μόνο θετικούς αριθμούς. Για να δηλώσετε μια μεταβλητή ως ανυπόγραφο, χρησιμοποιήστε λέξη-κλειδί ανυπόγραφο:

ανυπόγραφο char c; ανυπόγραφο κοντό s? ανυπόγραφο int i? ανυπόγραφο μακρύ l; ανυπόγραφο μακρύ μακρύ ll?

ανυπόγραφο char c ;

ανυπόγραφο κοντό s ;

ανυπόγραφο int i ;

ανυπόγραφο μακρύ l ;

ανυπόγραφο μακρύ μακρύ ll?

Μια ανυπόγραφη ακέραια μεταβλητή 1 byte έχει εύρος τιμών από 0 έως 255.

Λάβετε υπόψη ότι η δήλωση μιας μεταβλητής ως ανυπόγραφη σημαίνει ότι δεν μπορεί να περιέχει αρνητικούς αριθμούς (μόνο θετικούς).

Τώρα που καταλαβαίνετε τη διαφορά μεταξύ υπογεγραμμένου και ανυπόγραφου, ας δούμε τα εύρη τιμών διαφορετικών τύπων δεδομένων:

Τύπος Μεγέθους Εύρος τιμών
1 byte υπογεγραμμένο -128 έως 127
1 byte χωρίς υπογραφή από 0 έως 255
2 byte υπογεγραμμένα από -32.768 έως 32.767
2 byte χωρίς υπογραφή από 0 έως 65 535
4 byte υπογεγραμμένα από -2 147 483 648 έως 2 147 483 647
4 byte ανυπόγραφα από 0 έως 4 294 967 295
8 byte υπογεγραμμένα από -9 223 372 036 854 775 808 έως 9 223 372 036 854 775 807
8 byte ανυπόγραφα από 0 έως 18 446 744 073 709 551 615

Για τους μαθηματικούς: μια υπογεγραμμένη μεταβλητή με νιοστό αριθμό bit έχει εύρος από -(2 n-1) έως 2 n-1 -1. Μια ανυπόγραφη μεταβλητή με ένα νιοστό αριθμό bit έχει εύρος από 0 έως (2n)-1. Για μη μαθηματικούς: χρησιμοποιήστε έναν πίνακα :)

Οι αρχάριοι προγραμματιστές μερικές φορές μπερδεύονται μεταξύ υπογεγραμμένων και ανυπόγραφων μεταβλητών. Αλλά υπάρχει ένας εύκολος τρόπος να θυμάστε τις διαφορές τους. Ποια είναι η διαφορά μεταξύ ενός αρνητικού αριθμού και ενός θετικού; Σωστά! Μείον μπροστά. Εάν δεν υπάρχει μείον, τότε ο αριθμός είναι θετικός. Επομένως, ένας υπογεγραμμένος ακέραιος τύπος σημαίνει ότι μπορεί να υπάρχει ένα σύμβολο μείον, δηλ. Οι αριθμοί μπορεί να είναι είτε θετικοί είτε αρνητικοί. Ένας ανυπόγραφος ακέραιος τύπος σημαίνει ότι το σύμβολο μείον μπροστά απουσιάζει εντελώς, δηλ. οι αριθμοί μπορούν να είναι μόνο θετικοί.

Ποια είναι η προεπιλογή: υπογεγραμμένο ή ανυπόγραφο;

Τι συμβαίνει λοιπόν αν δηλώσουμε μια μεταβλητή χωρίς υπογραφή ή ανυπόγραφη;

Όλοι οι ακέραιοι τύποι δεδομένων εκτός από το char υπογράφονται από προεπιλογή. Ο τύπος χαρακτήρων μπορεί να είναι είτε υπογεγραμμένος είτε ανυπόγραφος (αλλά συνήθως είναι υπογεγραμμένος).

Στις περισσότερες περιπτώσεις, η υπογεγραμμένη λέξη-κλειδί δεν γράφεται (χρησιμοποιείται ήδη από προεπιλογή), με εξαίρεση τον τύπο χαρακτήρων (καλύτερα να διευκρινιστεί εδώ).

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

Κανόνας: Χρησιμοποιήστε υπογεγραμμένους ακέραιους τύπους αντί ανυπόγραφο.

Ξεχείλισμα

Ερώτηση: "Τι θα συμβεί αν προσπαθήσουμε να χρησιμοποιήσουμε μια τιμή που βρίσκεται εκτός του εύρους τιμών ενός συγκεκριμένου τύπου δεδομένων;" Απάντηση: υπερχείλιση. Ξεχείλισμα(Αγγλικά) "ξεχείλισμα") εμφανίζεται όταν χάνονται bit επειδή η μεταβλητή δεν είχε αρκετή μνήμη για να τα αποθηκεύσει.

Παραδείγματα υπερχείλισης

Εξετάστε την ανυπόγραφη μεταβλητή, η οποία αποτελείται από 4 bit. Οποιοσδήποτε από τους δυαδικούς αριθμούς που αναφέρονται στον παραπάνω πίνακα θα χωρέσει μέσα σε αυτήν τη μεταβλητή.

"Αλλά τι θα συμβεί αν προσπαθήσουμε να εκχωρήσουμε μια τιμή που καταλαμβάνει περισσότερα από 4 bit;" Σωστά! Ξεχείλισμα. Η μεταβλητή μας θα αποθηκεύσει μόνο τα 4 λιγότερο σημαντικά (αυτά στα δεξιά) bit, όλα τα υπόλοιπα θα χαθούν.

Για παράδειγμα, αν προσπαθήσουμε να βάλουμε τον αριθμό 21 στη μεταβλητή των 4 bit:

Μετρικό σύστημα Δυαδικό σύστημα
21 10101

Ο αριθμός 21 καταλαμβάνει 5 bit (10101). Τα 4 bit στα δεξιά (0101) θα χωρέσουν στη μεταβλητή και το πιο αριστερό bit (1) απλά θα χαθεί. Εκείνοι. Η μεταβλητή μας θα περιέχει το 0101, το οποίο είναι ίσο με 101 (το μπροστινό μηδέν δεν μετράει) και αυτός είναι ήδη ο αριθμός 5, όχι 21.

Σημείωση: Θα γίνει ξεχωριστό μάθημα για τη μετατροπή αριθμών από δυαδικό σε δεκαδικό και αντίστροφα, όπου θα εξετάσουμε και θα συζητήσουμε τα πάντα αναλυτικά.

Τώρα ας δούμε ένα παράδειγμα σε κώδικα (ο σύντομος τύπος παίρνει 16 bit):

#περιλαμβάνω int main() ( unsigned short x = 65535; // η μεγαλύτερη τιμή που μπορεί να αποθηκεύσει μια ανυπόγραφη μεταβλητή 16 bit std::cout<< "x was: " << x << std::endl; x = x + 1; // 65536 - это число больше максимально допустимого числа из диапазона допустимых значений. Следовательно, произойдёт переполнение, так как переменнная x не может хранить 17 бит std::cout << "x is now: " << x << std::endl; return 0; }

#περιλαμβάνω

int main()

ανυπόγραφο short x = 65535 ; // η μεγαλύτερη τιμή που μπορεί να αποθηκεύσει μια μεταβλητή χωρίς υπογραφή 16 bit

std::cout<< "x was: " << x << std :: endl ;

x = x + 1 ; // 65536 είναι ένας αριθμός μεγαλύτερος από τον μέγιστο επιτρεπόμενο αριθμό από το εύρος των έγκυρων τιμών. Επομένως, θα συμβεί υπερχείλιση, καθώς η μεταβλητή x δεν μπορεί να αποθηκεύσει 17 bit

std::cout<< "x is now: " << x << std :: endl ;

επιστροφή 0 ;

x ήταν: 65535
Το x είναι τώρα: 0

Τι συνέβη? Προέκυψε υπερχείλιση επειδή προσπαθήσαμε να στριμώξουμε κάτι που δεν μπορούσε να ωθηθεί στη μεταβλητή x.

Για όσους θέλουν να μάθουν περισσότερα:Ο αριθμός 65535 στο δυαδικό σύστημα αντιπροσωπεύεται ως 1111 1111 1111 1111. Το 65535 είναι ο μεγαλύτερος αριθμός που μπορεί να αποθηκεύσει μια ανυπόγραφη ακέραια μεταβλητή 2 byte (16 bit), επειδή χρησιμοποιεί και τα 16 bit. Όταν προσθέσουμε 1, παίρνουμε τον αριθμό 65536. Ο αριθμός 65536 αναπαρίσταται δυαδικά ως 1 0000 0000 0000 0000 και καταλαμβάνει 17 bit! Επομένως, το πιο σημαντικό bit (που είναι 1) χάνεται και διατηρούνται και τα 16 bit στα δεξιά. Ο συνδυασμός 0000 0000 0000 0000 αντιστοιχεί στο δεκαδικό 0, που είναι το αποτέλεσμά μας.

Ομοίως, θα λάβουμε μια υπερχείλιση χρησιμοποιώντας έναν αριθμό μικρότερο από το ελάχιστο του εύρους των έγκυρων τιμών:

#περιλαμβάνω int main() ( unsigned short x = 0; // η μικρότερη τιμή που μπορεί να αποθηκεύσει μια ανυπόγραφη μεταβλητή 2 byte std::cout<< "x was: " << x << std::endl; x = x - 1; // переполнение! std::cout << "x is now: " << x << std::endl; return 0; }

#περιλαμβάνω

int main()

ανυπόγραφο σύντομο x = 0 ; // τη μικρότερη τιμή που μπορεί να αποθηκεύσει μια ανυπόγραφη μεταβλητή 2 byte

std::cout<< "x was: " << x << std :: endl ;

x = x - 1; // υπερχείλιση!

std::cout<< "x is now: " << x << std :: endl ;

επιστροφή 0 ;

Το αποτέλεσμα της εκτέλεσης του προγράμματος παραπάνω:

x ήταν: 0
Το x είναι τώρα: 65535

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



Έχετε ερωτήσεις;

Αναφέρετε ένα τυπογραφικό λάθος

Κείμενο που θα σταλεί στους συντάκτες μας: