Dado el siguiente fragmento:largo largo vs int multiplicación
#include <stdio.h>
typedef signed long long int64;
typedef signed int int32;
typedef signed char int8;
int main()
{
printf("%i\n", sizeof(int8));
printf("%i\n", sizeof(int32));
printf("%i\n", sizeof(int64));
int8 a = 100;
int8 b = 100;
int32 c = a * b;
printf("%i\n", c);
int32 d = 1000000000;
int32 e = 1000000000;
int64 f = d * e;
printf("%I64d\n", f);
}
La salida con MinGW GCC 3.4.5 es (-O0):
1
4
8
10000
-1486618624
La primera multiplicación es fundido a una int32 internamente (según la salida del ensamblador). La segunda multiplicación no se realiza. No estoy seguro de si los resultados difieren porque el programa se estaba ejecutando en un IA32 o porque está definido en algún lugar del estándar C. Sin embargo, estoy interesado si este comportamiento exacto se define en algún lugar (ISO/IEC 9899?), Porque me gusta entender mejor por qué y cuándo tengo que lanzar manualmente (tengo problemas para portar un programa desde una arquitectura diferente).
Muy bien puesto. @azraiyl debería cambiar esa línea a 'int64 f = (int64) d * e;' –
Lamento que no haya declarado que conozco la solución aquí. Lo que me interesa es por qué la multiplicación es int32 * int32 en el primer caso y no int8 * int8. Incluso si la CPU solo admite la multiplicación int32, puede volver a conectarse a un int8 después de la multiplicación. Pero la instrucción imul IA32 funciona para los registros de 8 bits (AL, ...). – azraiyl
@azrayl: Al menos en C90, C promovió todos los operandos aritméticos a 'int' si eran de tipos más pequeños. Un vistazo al estándar C99 sugiere que este ya no es el caso, pero no estoy seguro. ¿Qué compilador de C está utilizando y, si corresponde, con qué opciones? –