Tracce
/
Rust
Rust
/
Programma
/
Numeri interi
Nu

Numeri interi in Rust

1 esercizio

Informazioni su Numeri interi

I numeri interi sono numeri senza parte frazionaria né decimale. Nella macchina sono rappresentati come una sequenza di bit binari.

I numeri interi possono avere o non avere il segno. Il segno significa riservare uno dei bit del numero per indicare se quel numero è negativo oppure no.

Tutti i numeri interi hanno una larghezza in bit, cioè semplicemente il numero di bit che compongono quel numero. Questa larghezza determina il valore massimo che quel tipo intero può rappresentare.

Per esempio, uno dei tipi interi più comuni è u8: un intero senza segno a 8 bit. Potresti riconoscere questo tipo: è un singolo byte. Ha un valore minimo di 0 e un valore massimo di 255.

Rust ha 12 tipi primitivi di numeri interi, suddivisi per larghezza in bit e presenza del segno:

Senza segno Con segno
u8 i8
u16 i16
u32 i32
u64 i64
u128 i128
usize isize

La larghezza in bit di un intero è sempre indicata dal numero che segue la u o la i. usize e isize sono speciali: hanno la stessa larghezza di un puntatore sulla macchina di destinazione. Questo significa che su un'architettura a 64 bit, usize e isize sono larghi 64 bit, mentre su un'architettura a 32 bit sono larghi 32 bit.

Quale usare?

In generale, se ti serve solo rappresentare un numero, usa un i32: 32 bit hanno una gamma abbastanza ampia da rendere un overflow relativamente improbabile, e i numeri con segno riservano meno sorprese di quelli senza segno. i32 equivale a un long in C, o a un int in Java. Se usi un letterale numerico e non annoti esplicitamente il tipo, il valore predefinito sarà i32.

Se lavori con dati binari, la cosa più semplice è lavorare con i byte: &[u8] o Vec<u8>.

Rust usa usize per la dimensione e l'indicizzazione delle collezioni. Questo perché un computer può indirizzare teoricamente solo usize::MAX byte di memoria, quindi non sono possibili collezioni in memoria più grandi. Di conseguenza, usize può essere utile se lavori molto con le collezioni.

Se i tuoi dati non entrano in un intero a 32 bit, considera di passare a un intero a 64 o 128 bit. Se i tuoi dati non entrano in un intero a 128 bit, allora puoi usare un tipo per interi grandi come quello fornito da num-bigint.

Gli interi a 16 bit non sono molto comuni, ma possono essere utili quando si punta a determinati microcontroller.

Se sai che per la tua applicazione non esistono casi negativi validi, è meglio usare un intero senza segno anziché uno con segno. Un buon esempio è il conteggio.

Conversione tra numeri interi

Rust non ha conversioni numeriche implicite. Se devi fare un cast tra tipi interi, ci sono due strategie di base: la parola chiave as e i trait From e TryFrom.

Usare la parola chiave as è semplice: expr as Type. Tuttavia, ci sono una serie di avvertenze e sottigliezze che devi tenere a mente quando usi i cast con as.

Il cast basato sui trait è un po' più complicato, ma più sicuro: i trait di conversione sono implementati solo dove la conversione è sicura. Per esempio, i32 implementa From<u8>, From<u16>, From<i8> e From<i16>: qualsiasi valore rappresentabile da uno di questi tipi è garantito essere rappresentabile in un i32. Si può usare come i32::from(expr), oppure expr.into(), dove expr corrisponde a uno di quei tipi. i32 implementa anche TryFrom<u32>, TryFrom<u64>, TryFrom<u128>, TryFrom<usize>, TryFrom<i64>, TryFrom<i128> e TryFrom<isize>. Queste conversioni riusciranno esplicitamente oppure andranno in overflow, a seconda del valore. Per usarle, dovrai importare i trait std::convert::TryFrom o std::convert::TryInto a seconda dei casi, e poi usare i32::try_from(expr) o expr.try_into(), dove expr ha un tipo appropriato.

In generale è preferibile usare il cast basato sui trait invece del cast con as, soprattutto quando si converte da un tipo più largo a uno più stretto. Il cast basato sui trait è solo marginalmente più costoso del cast con as: usare as per motivi di prestazioni non vale la pena, a meno che non si tratti di un ciclo estremamente critico per le prestazioni.

Modifica tramite GitHub Il collegamento si apre in una nuova finestra o scheda