Οι ακέραιοι είναι αριθμοί χωρίς κλασματικό ή δεκαδικό μέρος. Αναπαρίστανται στη μηχανή ως ένα μοτίβο δυαδικών bit.
Οι ακέραιοι μπορεί να είναι προσημασμένοι ή όχι. Η προσημασμένη αναπαράσταση σημαίνει ότι δεσμεύεται ένα από τα bit του αριθμού για να δείξει αν ο αριθμός είναι αρνητικός ή όχι.
Όλοι οι ακέραιοι έχουν ένα πλάτος bit, που είναι απλώς ο αριθμός των bit που αποτελούν τον αριθμό. Αυτό επηρεάζει τη μέγιστη τιμή που μπορεί να αναπαραστήσει αυτός ο τύπος ακέραιου.
Για παράδειγμα, ένας από τους πιο συνηθισμένους τύπους ακέραιων είναι ο u8: ένας απρόσημος ακέραιος 8 bit. Ίσως αναγνωρίζεις αυτόν τον τύπο ως ένα μόνο byte. Έχει ελάχιστη τιμή το 0 και μέγιστη τιμή το 255.
Η Rust έχει 12 αρχέγονους τύπους ακέραιων, χωρισμένους κατά πλάτος bit και κατά πρόσημο:
| Χωρίς πρόσημο | Με πρόσημο |
|---|---|
u8 |
i8 |
u16 |
i16 |
u32 |
i32 |
u64 |
i64 |
u128 |
i128 |
usize |
isize |
Το πλάτος bit ενός ακέραιου δηλώνεται πάντα από τον αριθμό μετά το u ή το i. Οι usize και isize είναι ειδικοί: έχουν το ίδιο πλάτος με έναν δείκτη στη μηχανή-στόχο. Αυτό σημαίνει ότι σε αρχιτεκτονική 64 bit, οι usize και isize έχουν πλάτος 64 bit, αλλά σε αρχιτεκτονική 32 bit έχουν πλάτος 32 bit.
Γενικά, αν χρειάζεται απλώς να αναπαραστήσεις κάποιον αριθμό, χρησιμοποίησε έναν i32: τα 32 bit έχουν αρκετά μεγάλο εύρος, ώστε είναι σχετικά απίθανο να υπάρξει υπερχείλιση, και οι προσημασμένοι αριθμοί έχουν λιγότερες εκπλήξεις από τους απρόσημους. Ο i32 είναι ισοδύναμος με έναν long στη C ή έναν int στη Java. Αν χρησιμοποιήσεις έναν αριθμητικό literal και δεν δηλώσεις ρητά τον τύπο, θα πάρει προεπιλεγμένα τον i32.
Αν δουλεύεις με δυαδικά δεδομένα, το πιο εύκολο είναι να δουλέψεις με byte: &[u8] ή Vec<u8>.
Η Rust χρησιμοποιεί τον usize για το μέγεθος και τη δεικτοδότηση συλλογών. Αυτό συμβαίνει επειδή ένας υπολογιστής μπορεί θεωρητικά να διευθυνσιοδοτήσει μόνο usize::MAX byte μνήμης, οπότε δεν είναι δυνατές μεγαλύτερες συλλογές στη μνήμη. Επομένως, ο usize μπορεί να φανεί χρήσιμος αν κάνεις πολλή δουλειά με συλλογές.
Αν τα δεδομένα σου δεν χωρούν σε έναν ακέραιο 32 bit, σκέψου να περάσεις σε έναν ακέραιο 64 ή 128 bit. Αν τα δεδομένα σου δεν χωρούν σε έναν ακέραιο 128 bit, τότε μπορείς να χρησιμοποιήσεις έναν τύπο μεγάλου ακέραιου, όπως αυτός που παρέχει το num-bigint.
Οι ακέραιοι 16 bit δεν είναι πολύ συνηθισμένοι, αλλά μπορεί να φανούν χρήσιμοι όταν στοχεύεις ορισμένους μικροελεγκτές.
Αν ξέρεις ότι δεν υπάρχουν έγκυρες αρνητικές περιπτώσεις για την εφαρμογή σου, είναι καλύτερα να χρησιμοποιήσεις έναν απρόσημο ακέραιο αντί για έναν προσημασμένο. Η καταμέτρηση είναι ένα καλό παράδειγμα.
Η Rust δεν έχει έμμεσες αριθμητικές μετατροπές. Αν χρειάζεται να κάνεις cast μεταξύ τύπων ακέραιων, υπάρχουν δύο βασικές στρατηγικές: η λέξη-κλειδί as και τα trait From και TryFrom.
Η χρήση της λέξης-κλειδί as είναι απλή: expr as Type. Ωστόσο, υπάρχουν αρκετές παγίδες και λεπτομέρειες που πρέπει να έχεις υπόψη σου όταν χρησιμοποιείς cast με as.
Το cast μέσω trait είναι λίγο πιο σύνθετο, αλλά πιο ασφαλές: τα trait μετατροπής υλοποιούνται μόνο εκεί που είναι ασφαλή. Για παράδειγμα, ο i32 υλοποιεί τα From<u8>, From<u16>, From<i8> και From<i16>: κάθε τιμή που μπορεί να αναπαρασταθεί από οποιονδήποτε από αυτούς τους τύπους είναι εγγυημένο ότι μπορεί να αναπαρασταθεί σε έναν i32. Μπορεί να χρησιμοποιηθεί ως i32::from(expr) ή expr.into(), όπου το expr αντιστοιχεί σε έναν από αυτούς τους τύπους. Ο i32 υλοποιεί επίσης τα TryFrom<u32>, TryFrom<u64>, TryFrom<u128>, TryFrom<usize>, TryFrom<i64>, TryFrom<i128> και TryFrom<isize>. Αυτές οι μετατροπές είτε θα πετύχουν είτε θα υπερχειλίσουν ρητά, ανάλογα με την τιμή. Για να τις χρησιμοποιήσεις, θα χρειαστεί να εισάγεις τα trait std::convert::TryFrom ή std::convert::TryInto ανάλογα και μετά να χρησιμοποιήσεις το i32::try_from(expr) ή το expr.try_into(), όπου το expr αντιστοιχεί σε έναν κατάλληλο τύπο.
Το cast μέσω trait αντί για cast με as προτιμάται γενικά, ειδικά όταν μετατρέπεις από έναν πιο πλατύ σε έναν πιο στενό τύπο. Το cast μέσω trait είναι αμελητέα πιο ακριβό από το cast με as: η χρήση του as για λόγους απόδοσης δεν αξίζει, εκτός αν βρίσκεσαι μέσα σε έναν βρόχο που εκτελείται πάρα πολύ συχνά.