|
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.
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. |