Kurzusok
/
Rust
Rust
/
Tanterv
/
Egész számok
Eg

Egész számok ebben a kurzusban: Rust

1 feladat

A(z) Egész számok fogalomról

Az egész számok egész értékek. Nincs tört- vagy tizedesrészük. A gépben bináris bitek mintájaként ábrázoljuk őket.

Az egész számok lehetnek előjelesek vagy előjel nélküliek. Az előjelesség azt jelenti, hogy a szám egyik bitjét fenntartjuk annak jelzésére, hogy a szám negatív-e.

Minden egész számnak van bitszélessége, ami egyszerűen a számot alkotó bitek száma. Ez befolyásolja azt a maximális értéket, amelyet az adott egésztípus ábrázolni tud.

Például az egyik leggyakoribb egésztípus a u8: egy előjel nélküli, 8 bites egész szám. Ezt a típust egyetlen bájtról ismerheted fel. Minimumértéke 0, maximumértéke 255.

A Rustnak 12 primitív egésztípusa van, bitszélesség és előjelesség szerint csoportosítva:

Előjel nélküli Előjeles
u8 i8
u16 i16
u32 i32
u64 i64
u128 i128
usize isize

Egy egész szám bitszélességét mindig a u vagy i utáni szám jelzi. Az usize és az isize különleges: ugyanolyan szélesek, mint egy mutató a célgépen. Ez azt jelenti, hogy egy 64 bites architektúrán az usize és az isize 64 bit széles, egy 32 bites architektúrán viszont 32 bit széles.

Melyiket használjam?

Általában, ha csak ábrázolni szeretnél egy számot, használj i32-t: a 32 bit elég széles tartomány ahhoz, hogy viszonylag ritkán forduljon elő túlcsordulás, az előjeles számok pedig kevesebb meglepetést tartogatnak, mint az előjel nélküliek. Az i32 megfelel a C long típusának vagy a Java int típusának. Ha numerikus literált használsz, és nem adod meg kifejezetten a típust, az alapértelmezés az i32 lesz.

Ha bináris adatokkal dolgozol, a legegyszerűbb bájtokkal dolgozni: &[u8] vagy Vec<u8>.

A Rust az usize típust használja a gyűjtemények méretéhez és indexeléséhez. Ennek az az oka, hogy egy számítógép elméletileg legfeljebb usize::MAX bájt memóriát tud címezni, így ennél nagyobb memóriabeli gyűjtemények nem lehetségesek. Ezért az usize hasznos lehet, ha sok munkát végzel gyűjteményekkel.

Ha az adataid nem férnek bele egy 32 bites egész számba, fontold meg, hogy 64 vagy 128 bites egész számra váltasz. Ha az adataid egy 128 bites egész számba sem férnek bele, akkor használhatsz egy nagy egésztípust, például amilyet a num-bigint biztosít.

A 16 bites egész számok nem túl gyakoriak, de bizonyos mikrokontrollereknél hasznosak lehetnek.

Ha tudod, hogy az alkalmazásodban nincsenek érvényes negatív esetek, jobb előjel nélküli egész számot használni előjeles helyett. A számlálás jó példa erre.

Átalakítás egész számok között

A Rustban nincsenek implicit numerikus átalakítások. Ha egésztípusok között kell kasztolnod, két alapvető stratégia van: az as kulcsszó, valamint a From és a TryFrom trait.

Az as kulcsszó használata egyszerű: expr as Type. Számos buktatót és finomságot azonban érdemes szem előtt tartanod, amikor as kasztokat használsz.

A trait-alapú kasztolás kicsit bonyolultabb, de biztonságosabb: az átalakító trait-ek csak ott vannak implementálva, ahol biztonságosak. Például az i32 implementálja a From<u8>, From<u16>, From<i8> és From<i16> trait-eket: minden érték, amelyet ezen típusok bármelyike ábrázolni tud, garantáltan ábrázolható egy i32-ben is. Így használhatod: i32::from(expr) vagy expr.into(), ahol az expr ezen típusok egyikének felel meg. Az i32 emellett a TryFrom<u32>, TryFrom<u64>, TryFrom<u128>, TryFrom<usize>, TryFrom<i64>, TryFrom<i128> és TryFrom<isize> trait-eket is implementálja. Ezek az átalakítások kifejezetten vagy sikerülnek, vagy túlcsordulnak, az értéktől függően. A használatukhoz importálnod kell a std::convert::TryFrom vagy a std::convert::TryInto trait-et, aszerint, hogy melyikre van szükséged, majd az i32::try_from(expr) vagy az expr.try_into() formában kell használnod, ahol az expr egy megfelelő típusnak felel meg.

Általában a trait-alapú kasztolást érdemes előnyben részesíteni az as kasztolással szemben, különösen amikor szélesebb típusból szűkebb típusba konvertálsz. A trait-alapú kasztolás elhanyagolhatóan drágább, mint az as kasztolás: nem éri meg teljesítménybeli okokból az as-t használni, hacsak nem egy rendkívül gyakran futó ciklusról van szó.

Szerkesztés GitHubon A hivatkozás új ablakban vagy lapon nyílik meg