2008-12-01 11 views
17

Según el estándar c99, el tamaño de long long debe ser como mínimo de 64 bits. ¿Cómo se implementa esto en una máquina de 32 bits (por ejemplo, adición o multiplicación de 2 long long s). Además, ¿cuál es el equivalente de long long en C++.implementación larga larga en máquina de 32 bits

+0

Las máquinas de 8 y 16 bits también lograron manejar variables más grandes que su "bitness del procesador". Muchas preguntas ya están respondidas por la historia. –

Respuesta

8

En la arquitectura IA32, el entero de 64 bits se implementa utilizando dos registros de 32 bits (eax y edx).

Existen equivalentes específicos de plataforma para C++, y puede usar el encabezado stdint.h donde esté disponible (boost le proporciona one).

2

Si se preocupan por tamaños de bits, debe utilizar

#include <stdint.h> 

int32_t n; 

y amigos. Esto también funciona para C++.

Los números de 64 bits en las máquinas de 32 bits se implementan como usted piensa, por 4 bytes adicionales. Por lo tanto, usted podría implementar su propio 64-bit tipo de datos al hacer algo como esto:

struct my_64bit_integer { 
    uint32_t low; 
    uint32_t high; 
}; 

Se podría, por supuesto, tienen que poner en práctica los operadores matemáticos mismo.

Hay un int64_t en stdint.h que viene con mi versión de GCC, y en Microsoft Visual C++ también tiene el tipo __int64.

14

El equivalente en C++ también es largo. No es requerido por el estándar, pero la mayoría de los compiladores lo soportan porque es muy útil.

¿Cómo se implementa? La mayoría de las arquitecturas de computadoras ya tienen soporte integrado para adiciones y restas de palabras múltiples. No hacen adiciones de 64 bits directamente, sino que usan el indicador de acarreo y una instrucción de adición especial para crear un agregado de 64 bits a partir de dos adiciones de 32 bits.

La misma extensión existe para la resta también (el acarreo se denomina pedir prestado en estos casos).

Las multiplicaciones y divisiones de Longword se pueden construir a partir de multiplicaciones más pequeñas sin la ayuda de indicadores de acarreo. A veces, simplemente, hacer las operaciones poco a poco es más rápido.

Hay arquitecturas que no tienen ninguna bandera (algunos chips DSP y micros simples). En estas arquitecturas, el desbordamiento debe detectarse con operaciones lógicas. La aritmética de palabras múltiples tiende a ser lenta en estas máquinas.

3

Como todos han afirmado, un entero de 64 bits se implementa normalmente simplemente utilizando dos enteros de 32 bits juntos. Luego, la generación de código inteligente se utiliza para realizar un seguimiento de los bits carry and/or borrow para realizar un seguimiento del desbordamiento y ajustar en consecuencia.

Esto, por supuesto, hace que dicha aritmética sea más costosa en términos de espacio de código y tiempo de ejecución, que el mismo código compilado para una arquitectura con soporte nativo para operaciones de 64 bits.

1

El próximo estándar de C++ (con vencimiento en 2009, o tal vez 2010), está programado para incluir el tipo de "larga duración". Como se mencionó anteriormente, ya es de uso común.

La implementación corresponde a los escritores del compilador, aunque las computadoras siempre han admitido operaciones de precisión múltiples.Algunos lenguajes, como Python y Common Lisp, requieren soporte para enteros de precisión indefinida. Hace mucho tiempo, escribí rutinas de multiplicación y división de 64 bits para una computadora (la Z80) que podía administrar sumas y restas de 16 bits, sin multiplicación de hardware.

Probablemente la forma más fácil de ver cómo se implementa una operación en su compilador en particular es escribir un ejemplo de código y examinar la salida del ensamblador, que está disponible en todos los principales compiladores con los que he trabajado.

Cuestiones relacionadas