Home Rhyylen
Contatto
Programmazione
 
 
V Language
Capitolo 5
Gli interi

Eccoci al tipo più classico nel mondo della programmazione, gli interi.
Subito la tabella che descrive la suddivisione basata su estensione in bit e conseguenti range.

Tipo Bit Valori ammessi Note
i8 8 da -128 a 127 intero con segno, 1 byte
i16 16 da -32 768 a 32 767 intero con segno, 2 byte
int 32 da -2 147 483 648 a 2 147 483 647 default per gli interi con segno
i64 64 da -9 223 372 036 854 775 808 a 9 223 372 036 854 775 807 grande intero con segno
i128 128 valori enormi (circa ±1.7e38) usato raramente, più costoso
u8 8 da 0 a 255 intero senza segno, 1 byte
u16 16 da 0 a 65 535 intero senza segno, 2 byte
u32 32 da 0 a 4 294 967 295 intero senza segno, 4 byte
u64 64 da 0 a 18 446 744 073 709 551 615 intero senza segno, 8 byte
u128 128 da 0 a ~3.4e38 enorme intero senza segno
rune 32 codice Unicode (U+0000 … U+10FFFF) alias di int, usato per caratteri

Iniziamo dalle basi, ovvero dalle operazioni consuete.

fn main() {    
  x1 := 7    
  x2 := 4    
  println(x1 + x2)    
  println(x1 - x2)    
  println(x1 * x2)    
  println(x1 / x2)    
  println(x1 % x2)
}

Non c'è bisogno di grandi spiegazioni. La  divisione, alla penultima riga, restituisce il risultato intero, mentre l'ultima è il resto della divisione. Nessuna novità fin qui. Ovviamente il numero di operazioni qui è limitato ma abbiamo a disposizione molto di più. Affinchè questo "di più" sia a nostra disposizione dobbiamo ricorrere alla libreria esterna math la quale è ricca di funzioni precotte che ci permette di ampliare notevolmente le nostre capacità di manipolazione dei numeri. Questo vale anche per i numeri con virgola, che vedremo nel prossimo paragrafo.
Ad esempio se volete l'elevamento a potenza potrete usare la funzione powi (che vale appunto solo tra interi come indica l'ultima lettera)


import math
fn main()
{
    println(math.powi(3, 3))
}

oppure, sempre per esempio, se volete il cubo di un numero:

math.cube(numero)

il fattoriale non necessiterà più dello sviluppi di funzioni ricorsive:

import math
fn main() {
    println(math.factoriali(5))
}

da notare la funzione factoriali che lavora sugli interi mentre all'interno di math troviamo anche factorial (senza "ì") che prende in input e restituisce in output un numero con virgola.
Noterete la necessità dell'inserimento dell'istruzione
import math.
Come è facile notare, la parola chiave
import serve a rendere disponibili le librerie specificate dopo di essa.
Insomma math vi mette a disposizione un elenco lunghissimo di funzioni, elenco che potrete trovare integralmente sul sito ufficiale molto ben dettagliato.

Un problema a parte è la convivenza con i numeri con virgola di cui parleremo nel prossimo paragrafo.

In questa sede però è interessante parlare della gestione degli overflow. Il fatto che gli interi siano definiti con una certa magnitudine, espressa dai bit a loro destinati, implica che qualora l'estensione del numero vada oltre la capacità del tipo in cui si trova per così dire ingabbiato si avrebbe un problema di valore reale. Se ad esempio abbiamo forzato una variabile nell'ambito degli i16 e poi lo sottopniamo ad una operazione che va oltre il limite degli interi a 8 bit cosa succede? Si ha un overflow che origina un valore che con ogni probabilità causerà un disastro (caso Ariane, che cito sempre, docet). Il seguente codice mostra il problema:

fn main() {
    mut x := i8(127)
    x++ // provo a incrementare oltre il limite
    println(x)
}

e otterrete come risultato un rotondo -128. Il risultato non deve stupire se avete la conoscenza della rappresentazione binaria dei numeri. In questo senso la gestione degli interi da parte di Python, ad esempio, è più semplice (un altro caso è anche del meno noto linguaggio Fantom che usa solo interi su 64 bit), certamente, soprattutto per chi inizia a programmare ma presenta anche delle controindicazioni.  V si comporta come la maggior parte dei linguaggi e dietro a questa scelta apparentemente illogica ci sono motivazioni abbastanza solide. Al momento in cui scrivo (settembre 2025) la gestione degli overflow non è ancora bene definita.