2010-06-18 35 views

Respuesta

20

El compilador sintetizará operaciones matemáticas (o usará llamadas a funciones) que usen más de una instrucción de CPU para realizar la operación. Por ejemplo, una operación de agregar agregará los componentes de bajo orden (las palabras bajas) de los valores long long y luego tomará el resultado de esa operación y lo alimentará a una operación de agregar en las palabras de orden superior del long long.

Así que el siguiente código C:

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

// ... 
c = a + b; 

podría estar representado por una secuencia de instrucciones que se ve algo como:

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 

Y si se tiene en cuenta por un momento, los compiladores de 8 y 16 bits los sistemas tenían que hacer este tipo de cosas para valores de 16 y/o 32 bits mucho antes de que se creara long long.

1

Probablemente como clase, no de forma nativa. De la misma manera que cualquier compilador puede/podría soportar cualquier conjunto de números grandes.

9

Internamente, el tipo está representado por una alta de textos y un bajo palabra, como:

struct long 
{ 
    int32 highWord; 
    uint32_t lowWord; 
} 

El compilador necesita saber si se trata de un entorno de 32 bits o de 64 bits y luego selecciona los reprenstations derecho de el número - si es de 64 bits, puede hacerse de forma nativa, si es de 32 bits, el compilador tiene que encargarse de las matemáticas entre la palabra alta/baja.

Si echas un vistazo a math.h, puedes ver las funciones utilizadas para esto y usarlas tú mismo. En una nota adicional, tenga en cuenta la diferencia entre little-endian y big-endian (see wiki), el uso depende del sistema operativo.

+1

Dos cosas adicionales: primero, el orden de esta estructura depende de la máquina. – Joshua

+0

En segundo lugar, las llamadas a funciones que operan en esta estructura están disponibles para usted. Se declaran en math.h. – Joshua

+0

thirs el 'lowByte' realmente sería' uint32_t' :-P –

2

Decir que una arquitectura es de 32 bits (o 64 o lo que sea) suele ser solo una aproximación de lo que el procesador es capaz de hacer. Por lo general, solo se refiere al ancho de los punteros con ese número, la aritmética puede ser bastante diferente. Por ejemplo, la arquitectura x86 tiene punteros de 32 bits, la mayoría de la aritmética se realiza en registros de 32 bits, pero también tiene soporte nativo para algunas operaciones básicas de 64 bits.

Además, no debe seguir la impresión de que los tipos enteros estándar tienen cierto ancho prescrito. En particular, long long es al menos 64 bit pero puede ser más ancho. Use el tipodefs int32_t, int64_t si desea estar portablemente seguro sobre el ancho.

Si usted quiere saber lo que gcc (o cualquier otro compilador) lo hace con mucho tiempo usted tiene que mirar en la especificación de la plataforma de destino particular,

2

Es bastante fácil de simplemente compilar y probar si usted tiene un sistema de 32 bits accesible. gcc tiene un indicador -S que activa el idioma del ensamblador. Esto es lo que produce en mi información de 32 bits:

// 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 
Cuestiones relacionadas