2010-06-18 17 views

risposta

20

Il compilatore sintetizza le operazioni matematiche (o usa chiamate di funzione) che utilizzano più di un'istruzione CPU per eseguire l'operazione. Ad esempio, un'operazione di aggiunta aggiungerà i componenti di ordine basso (le parole basse) dei valori long long e quindi eseguirà l'operazione e la inserirà in un'operazione di aggiunta nelle parole di ordine elevato di long long.

Così il seguente codice C:

long long a; 
long long b; 
long long c; 

// ... 
c = a + b; 

potrebbe essere rappresentato da una sequenza di istruzioni che sembra qualcosa di simile:

mov eax, [a.low] ; add the low order words 
add eax, [b.low] 

mov edx, [a.high] ; add the high order words, 
adc edx, [b.high] ; including the carry 

mov [c.low], eax 
mov [c.high], edx 

E se si considera per un momento, compilatori per 8 e 16 bit i sistemi dovevano fare questo tipo di cose per valori a 16 e/o 32 bit molto prima che venisse creato lo long long.

1

Molto probabilmente come una classe, non in modo nativo. allo stesso modo qualsiasi compilatore può/può supportare qualsiasi grande numero impostato.

9

Internamente, il tipo è rappresentato da un alto parola e un basso parola, come:

struct long 
{ 
    int32 highWord; 
    uint32_t lowWord; 
} 

Il compilatore deve sapere se si tratta di un ambiente a 32 bit o 64 bit e quindi seleziona i giusti reprenstations di il numero - se è a 64 bit, può essere fatto in modo nativo, se è a 32 bit, il compilatore deve occuparsi della matematica tra l'alto/il basso.

Se si ha un aspetto in matematica.h, è possibile vedere le funzioni utilizzate per questo e usarli da soli. Su una nota aggiuntiva, sii consapevole della differenza tra little-endian e big-endian (see wiki), l'utilizzo dipende dal sistema operativo.

+1

Due cose aggiuntive: in primo luogo, l'ordine di questa struttura dipende dall'ordine della macchina. – Joshua

+0

In secondo luogo, le chiamate di funzione che operano su questa struttura sono disponibili. Sono dichiarati in matematica.h. – Joshua

+0

il 'lowByte' sarebbe davvero' uint32_t' :-P –

2

Dire che un'architettura è a 32 bit (o 64 o qualsiasi altra cosa) di solito è solo un'approssimazione di ciò che il processore è in grado di fare. Solitamente si fa riferimento solo alla larghezza dei puntatori con quel numero, l'aritmetica potrebbe essere abbastanza diversa. E. l'architettura x86 ha puntatori a 32 bit, la maggior parte dell'aritmetica viene eseguita in registri a 32 bit, ma ha anche il supporto nativo per alcune operazioni di base a 64 bit.

Inoltre, non si deve seguire l'impressione che i tipi di interi standard abbiano una larghezza prescritta. In particolare, long long ha almeno 64 bit ma potrebbe essere più largo. Usa il typedefs int32_t, int64_t se vuoi essere sicuro della larghezza della porta.

Se volete sapere che cosa gcc (o qualsiasi altro compilatore) fa con lungo tempo si deve esaminare la specifica per il vostro particolare piattaforma di destinazione

2

E 'abbastanza facile per compilare solo e verificare se si dispone di un sistema a 32 bit accessibile. gcc ha una bandiera -S che attiva l'uscita della lingua di assemblaggio. Ecco cosa produce sulla mia intel a 32 bit:

// read two long longs from stack into eax:edx and ecx:ebx 
movl 32(%esp), %eax 
movl 36(%esp), %edx 
movl 24(%esp), %ecx 
movl 28(%esp), %ebx 
// a+b 
addl %ecx, %eax 
adcl %ebx, %edx 
// a-b 
subl %ecx, %eax 
sbbl %ebx, %edx 
// etc 
Problemi correlati