pregunta muy simple, he leído que GCC admite el tipo long long int. Pero, ¿cómo se pueden hacer operaciones matemáticas con él, cuando la CPU solo tiene 32 bits de ancho?Long int largo en máquinas de 32 bits
Respuesta
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
.
Probablemente como clase, no de forma nativa. De la misma manera que cualquier compilador puede/podría soportar cualquier conjunto de números grandes.
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.
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,
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
- 1. C++ int frente a largo
- 2. C++: long long int vs. long int vs. int64_t
- 3. ¿Es un int. Java siempre 32 bits?
- 4. sizeof (long) en 64 bits C++
- 5. double double vs long int
- 6. ¿GCC es compatible con long long int?
- 7. ¿Diferencia entre long e int en C#?
- 8. largo largo vs int multiplicación
- 9. Siempre es de 64 bits en las máquinas de 32 y 64 bits
- 10. Convierte long to two int y viceversa
- 11. long int en PHP
- 12. ¿Está int en C siempre de 32 bits?
- 13. en Scala, largo, int, etc.
- 14. equivalente en Java de unsigned long long?
- 15. strtok en máquinas de 64 bits
- 16. 'long long int' se interpreta como 'long int'. ¿Cómo puedo evitar esto?
- 17. Cómo convertir long a int en .net?
- 18. ¿Hay equivalente `int, short, long` en Perl? sistema de
- 19. Ejecute AnyCPU como 32 bits en sistemas de 64 bits
- 20. SetWindowsHookEx devuelve 0 al compilar para .NET Framework 4.0 en máquinas de 32 bits
- 21. encasillamiento Implícito en C (conversión de 32 bits sin signo de 8 bits a T int)
- 22. Convertir 12 bit int a 16 o 32 bits
- 23. ¿Cómo se divide un valor largo (32 bits) en cuatro variables de caracteres (8 bits) usando C?
- 24. Tipo de clave principal: int vs long
- 25. impresión unsigned long long int Tipo Valor Devuelve resultados extraños
- 26. ¿Hay tipos más grandes que long long int en C++?
- 27. velocidad de iteración de int vs largo
- 28. ¿Cuál es el tamaño de bit de largo en Windows de 64 bits?
- 29. app.config y máquinas de 64 bits
- 30. directorio syswow64 mediante aplicación de 32 bits
Dos cosas adicionales: primero, el orden de esta estructura depende de la máquina. – Joshua
En segundo lugar, las llamadas a funciones que operan en esta estructura están disponibles para usted. Se declaran en math.h. – Joshua
thirs el 'lowByte' realmente sería' uint32_t' :-P –