Successivo: , Precedente: , Su: Costanti   [Contenuti][Indice]


6.1.1.2 Numeri ottali ed esadecimali

In awk, tutti i numeri sono espressi nel sistema decimale (cioè a base 10). Molti altri linguaggi di programmazione consentono di specificare i numeri in altre basi, spesso in ottale (base 8) e in esadecimale (base 16). Nel sistema ottale i numeri hanno la sequenza 0, 1, 2, 3, 4, 5, 6, 7, 10, 11, 12, e così via. Come ‘11’ decimale è una volta 10 più 1, così ‘11’ ottale è una volta 8 più 1. Questo equivale a 9 nel sistema decimale. Nell’esadecimale ci sono 16 cifre. Poiché l’usuale sistema numerico decimale ha solo dieci cifre (‘0’–‘9’), le lettere da ‘a’ a ‘f’ rappresentano le cifre ulteriori. (normalmente è irrilevante se le lettere sono maiuscole o minuscole; gli esadecimali ‘a’ e ‘A’ hanno lo stesso valore). Così, ‘11’ esadecimale è 1 volta 16 più 1, il che equivale a 17 decimale.

Guardando solamente un ‘11’ puro e semplice, non si capisce in quale base sia. Così, in C, C++, e in altri linguaggi derivati da C, c’è una speciale notazione per esprimere la base. I numeri ottali iniziano con uno ‘0’, e i numeri esadecimali iniziano con uno ‘0x’ o ‘0X’:

11

Valore decimale 11

011

11 ottale, valore decimale 9

0x11

11 esadecimale, valore decimale 17

Quest’esempio mostra le differenze:

$ gawk 'BEGIN { printf "%d, %d, %d\n", 011, 11, 0x11 }'
-| 9, 11, 17

Poter usare costanti ottali ed esadecimali nei propri programmi è molto utile quando si lavora con dati che non possono essere rappresentati convenientemente come caratteri o come numeri regolari, come i dati binari di vario tipo.

gawk permette l’uso di costanti ottali ed esadecimali nel testo di un programma. Comunque, se numeri non-decimali sono presenti tra i dati in input, essi non sono trattati in maniera speciale; trattarli in modo speciale per default significherebbe che vecchi programmi awk produrrebbero risultati errati. (Se si vuole che i numeri siano trattati in maniera speciale, si deve specificare l’opzione da riga di comando --non-decimal-data; vedi la sezione Consentire dati di input non decimali.) Se si devono gestire dati ottali o esadecimali, si può usare la funzione strtonum() (vedi la sezione Funzioni di manipolazione di stringhe) per convertire i dati in numeri. La maggior parte delle volte, le costanti ottali o esadecimali si usano quando si lavora con le funzioni predefinite di manipolazione di bit; si veda Funzioni per operazioni di manipolazione bit per maggiori informazioni.

Diversamente da alcune tra le prime implementazioni di C, ‘8’ e ‘9’ non sono cifre valide nelle costanti ottali. Per esempio, gawk tratta ‘018’ come un 18 decimale:

$ gawk 'BEGIN { print "021 è", 021 ; print 018 }'
-| 021 è 17
-| 18

Le costanti ottali ed esadecimali nel codice sorgente sono un’estensione di gawk. Se gawk è in modalità compatibile (vedi la sezione Opzioni sulla riga di comando), non sono disponibili.

La base di una costante non influisce sul suo valore

Una volta che una costante numerica è stata convertita internamente in un numero [decimale], gawk non considera più la forma originale della costante; viene sempre usato il valore interno. Questo ha delle precise conseguenze per la conversione dei numeri in stringhe:

$ gawk 'BEGIN { printf "0x11 vale <%s>\n", 0x11 }'
-| 0x11 vale <17>

Successivo: , Precedente: , Su: Costanti   [Contenuti][Indice]