Διαδρομές
/
C#
C#
/
Ύλη
/
Ακέραιοι αριθμοί
Ακ

Ακέραιοι αριθμοί σε C#

7 ασκήσεις

Σχετικά με την έννοια Ακέραιοι αριθμοί

Η C#, όπως πολλές γλώσσες στατικής τυποποίησης, παρέχει έναν αριθμό τύπων που αναπαριστούν ακέραιους αριθμούς, καθένας με το δικό του εύρος τιμών. Στο κάτω άκρο, ο τύπος sbyte έχει ελάχιστη τιμή -128 και μέγιστη τιμή 127. Όπως σε όλους τους ακέραιους τύπους, αυτές οι τιμές είναι διαθέσιμες ως <type>.MinValue και <type>.MaxValue. Στο πάνω άκρο, ο τύπος long έχει ελάχιστη τιμή -9,223,372,036,854,775,808 και μέγιστη τιμή 9,223,372,036,854,775,807. Ανάμεσά τους βρίσκονται οι τύποι short και int.

Κάθε ένας από τους παραπάνω τύπους έχει το αντίστοιχό του χωρίς πρόσημο: sbyte/byte, short/ushort, int/uint και long/ulong. Σε όλες τις περιπτώσεις, το εύρος των τιμών είναι από το 0 έως το αρνητικό μέγιστο του προσημασμένου τύπου επί 2 συν 1.

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

Το πλήθος των ακέραιων τύπων αντανακλά τις αρχιτεκτονικές των μηχανών: το μέγεθος των καταχωρητών, το μέγεθος των ορισμάτων των εντολών της CPU και τον τρόπο χειρισμού του προσήμου μέσα στην CPU. Μια τιμή του τύπου long χρησιμοποιεί 64 bits, ενώ μια τιμή του τύπου sbyte χρησιμοποιεί 8 bits. Σε ορισμένες περιπτώσεις θα υπάρξουν επιπτώσεις στην απόδοση της CPU, στη χρήση της μνήμης και ακόμη και στη χρήση του δίσκου (όπου η επιλογή ενός μικρότερου ακέραιου τύπου είναι γενικά επωφελής). Η επιλογή του type του ακέραιου μπορεί επίσης να αποτελέσει έναν πρόχειρο και πρακτικό τρόπο για να επικοινωνήσεις σε άλλους προγραμματιστές πληροφορίες σχετικά με το αναμενόμενο εύρος τιμών. Ο τύπος int χρησιμοποιείται ευρέως ως ο προεπιλεγμένος τύπος όταν δεν έχει εντοπιστεί κάτι το ιδιαίτερο στη συγκεκριμένη χρήση. Ο long ή ο ulong χρησιμοποιείται ευρέως ως απλό αναγνωριστικό. Το μέγεθος του τύπου σε bytes καθορίζει το εύρος των τιμών.

Οι τύποι που εξετάσαμε μέχρι τώρα είναι πρωτογενείς τύποι. Κάθε ένας συνοδεύεται από ένα ψευδώνυμο struct που υλοποιεί πεδία (όπως το MinValue) και μεθόδους (όπως η ToString()) που σχετίζονται με τον τύπο.

Τύπος Δομή Πλάτος Ελάχιστο Μέγιστο
sbyte SByte 8 bit -128 +127
short Int16 16 bit -32_768 +32_767
int Int32 32 bit -2_147_483_648 +2_147_483_647
long Int64 64 bit -9_223_372_036_854_775_808 +9_223_372_036_854_775_807
byte Byte 8 bit 0 +255
ushort UInt16 16 bit 0 +65_535
uint UInt32 32 bit 0 +4_294_967_295
ulong UInt64 64 bit 0 +18_446_744_073_709_551_615

Μετατροπή τύπων

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

ulong ul;
uint ui = uint.MaxValue;
ul = ui;    // no problem

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

uint ui;
short s = 42;
ui = (uint)s;

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

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

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

Μετατροπή πρωτογενών τύπων - Έμμεση

Το σύστημα τύπων της C# είναι κάπως αυστηρότερο από εκείνο της C ή της JavaScript και, κατά συνέπεια, οι πράξεις μετατροπής είναι πιο περιορισμένες. Η έμμεση μετατροπή πραγματοποιείται μεταξύ δύο αριθμητικών τύπων αρκεί ο τύπος "προορισμού" να μπορεί να διατηρήσει την κλίμακα και το πρόσημο της τιμής του τύπου "πηγής".

Μια έμμεση μετατροπή δεν δηλώνεται με κάποια ειδική σύνταξη.

Μετατροπή πρωτογενών τύπων - Ρητή

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

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

Μετατροπή πρωτογενών τύπων - Παραδείγματα
int largeInt = Int32.MaxValue;
int largeNegInt = Int32.MinValue;
ushort shortUnsignedInt = ushort.MaxValue;

// implicit cast
int from_ushort = shortUnsignedInt;          // 65535
float from_int = largeInt;                   // -21474836E+09

// explicit cast
uint from_largeInt = (uint)largeInt;         // 2147483647
uint from_neg = (uint) largeNegInt;          // 2147483648 or OverflowException is thrown (if checked)

Μετατροπή bit

Η κλάση BitConverter παρέχει έναν βολικό τρόπο μετατροπής ακέραιων τύπων σε πίνακες bytes και αντίστροφα.

Αναφορές
Επεξεργασία μέσω GitHub Ο σύνδεσμος ανοίγει σε νέο παράθυρο ή καρτέλα

Μάθε την έννοια Ακέραιοι αριθμοί

Η εξάσκηση είναι κλειδωμένη

Ξεκλείδωσε 5 ακόμη ασκήσεις για να εξασκηθείς στην έννοια Ακέραιοι αριθμοί