domanda molto semplice, ho letto che GCC supporta il tipo long long int. Ma come può fare operazioni matematiche con esso, quando la CPU è solo a 32 bit?Int lungo lungo su macchine a 32 bit
risposta
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
.
Molto probabilmente come una classe, non in modo nativo. allo stesso modo qualsiasi compilatore può/può supportare qualsiasi grande numero impostato.
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.
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
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
- 1. Copia di bit da lungo a lungo in C#
- 2. Hash 32 bit int a 16 bit int?
- 3. È sempre 64 bit in entrambe le macchine a 32 e 64 bit
- 4. Come convertire l'int firmato a 32 bit int a 32 bit senza segno int?
- 5. Conversione di numeri interi senza segno a 32 bit (big endian) a lungo e indietro
- 6. strtok su macchine a 64 bit
- 7. Converti 12 bit int a 16 o 32 bit
- 8. Premere a lungo su UITableView
- 9. Errore troppo lungo numero troppo lungo Java?
- 10. C++ firmato e unsigned int vs lunga velocità lungo
- 11. Come dovrei mappare da lungo a int in hashCode()?
- 12. Come lungo silenzio lungo avvertimento costante intero da GCC
- 13. Contare il numero di bit in un intero a 64 bit (lungo, grande)?
- 14. Perché non riesco a leggere correttamente i valori del registro a 32 bit in HKCU su macchine a 64 bit?
- 15. Tipi di Scala, Lungo, Int, ecc
- 16. non firmato lungo lungo vs non firmato lungo (punto di vista della portabilità)
- 17. È un Java int sempre 32 bit?
- 18. Mappare un float a 32 bit su un intero a 32 bit
- 19. Compilare binario a 32 bit su sistema a 64 bit
- 20. Java Perché la conversione da lungo (64) a float (32) è considerata ampliata?
- 21. È int in C Sempre a 32 bit?
- 22. OpenCL: istruzione popcnt a 32 e 64 bit su GPU?
- 23. Pulsante premuto a lungo
- 24. Come viene eseguita la matematica a 64 bit su una macchina a 32 bit?
- 25. SQL Server 2012 a 32 bit o 64 bit su computer a 64 bit?
- 26. misure multiple da lungo a lungo ogni volta
- 27. TensorFlow su Linux a 32 bit?
- 28. Come confrontare un valore lungo è uguale a Valore lungo
- 29. Esegui AnyCPU come 32-bit su sistemi 64-bit
- 30. allineamenti nelle strutture su piattaforme a 32 bit
Due cose aggiuntive: in primo luogo, l'ordine di questa struttura dipende dall'ordine della macchina. – Joshua
In secondo luogo, le chiamate di funzione che operano su questa struttura sono disponibili. Sono dichiarati in matematica.h. – Joshua
il 'lowByte' sarebbe davvero' uint32_t' :-P –