Il computer (o più esattamente il compilatore) non si preoccupa affatto di quale numero di basi si usa nel codice sorgente. I linguaggi di programmazione più comunemente usati supportano direttamente le basi 8 (ottale), 10 (decimale) e 16 (esadecimale). Alcuni inoltre supportano direttamente i numeri di base 2 (binari). Le lingue specializzate possono supportare anche altre basi numeriche. (Con "supporto diretto", intendo che consentono l'immissione di numeri in quella base senza ricorrere a trucchi matematici come bitshifting, moltiplicazione, divisione ecc. Nel codice sorgente stesso. Ad esempio, C supporta direttamente base-16 con la sua 0x
numero prefisso e il normale set di cifre esadecimali di 0123456789ABCDEF. Ora, questi trucchi possono essere utili per rendere il numero più facile da capire nel contesto, ma finché si può esprimere lo stesso numero senza di essi, farlo - o no - è solo per comodità.)
Alla fine, tuttavia, questo è irrilevante. Diciamo che hai una frase simile a questa:
int n = 10;
L'intento è creare una variabile intera e inizializzarla con il numero decimale 10. Che cosa vede il computer?
i n t n = 1 0 ;
69 6e 74 20 6e 20 3d 20 31 30 3b (ASCII, hex)
Il compilatore lo renderizzerà e realizzerà che stai dichiarando una variabile di tipo int
con il nome n
, e assegnagli un valore iniziale. Ma qual è quel valore?
Al computer e ignorando i problemi di ordinamento e allineamento dei byte, l'input per il valore iniziale della variabile è 0x31 0x30
. Significa che il valore iniziale è 0x3130 (12592 in base 10)? Ovviamente no. Il parser della lingua deve continuare a leggere il file nella codifica dei caratteri utilizzata, quindi legge 1
0
seguito da un terminatore di istruzione. Dato che in questa base di lingua 10 si presume, questo legge (all'indietro) come "0 uno, 1 decine, fine". Ovvero, un valore di 10 decimale.
Se abbiamo specificato un valore in esadecimale e la nostra lingua utilizza 0x
per specificare che il seguente valore è esadecimale, otteniamo quanto segue:
i n t n = 0 x 1 0 ;
69 6e 74 20 6e 20 3d 20 30 78 31 30 3b (ASCII, hex)
Il compilatore vede 0x
(0x30 0x78) e riconosce che come prefisso di base-16, quindi cerca un numero di base-16 valido che lo segue. Fino al terminatore dell'istruzione, legge 10
. Questo si traduce in 0 "uno", 1 "sixteens", che funziona fino a 16 nella base 10. Oppure 00010000 nella base 2. O comunque ti piace rappresentarlo.
In entrambi i casi, ignorando le ottimizzazioni per motivi di semplicità, il compilatore assegna abbastanza spazio per contenere il valore di una variabile di tipo int
e inserisce lì il valore letto dal codice sorgente in una sorta di variabile di attesa temporanea. Quindi (probabilmente molto più tardi) scrive i valori binari risultanti nel file codice oggetto.
Come vedi, il modo in cui scrivi valori numerici nel codice sorgente è completamente irrilevante. può avere un effetto molto lieve sui tempi di compilazione, ma immagino che (di nuovo, ignorando tali ottimizzazioni come la memorizzazione nella cache del disco da parte del sistema operativo) cose come turbolenze casuali intorno i piatti rotanti del disco, i tempi di accesso al disco, le collisioni del bus dati, ecc. hanno un effetto molto più grande.
In conclusione: non preoccuparti. Scrivi numeri in una base supportata dal tuo linguaggio di programmazione preferito e che ha senso per il modo in cui il numero verrà utilizzato e / o letto. Hai passato molto più tempo a leggere questa risposta di quanto tu non possa mai recuperare in tempi di compilazione, facendo attenzione a quale base numerica usare nel codice sorgente. ;)