lange lange vs int Multiplikation

Angesichts der folgenden snippet:

#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);
}

Die Ausgabe mit MinGW-GCC 3.4.5 ist (-O0):

1
4
8
10000
-1486618624

Den ersten Multiplikation ist eingegossen in einen int32-intern (nach der assembler-Ausgabe). Die zweite Multiplikation wird nicht gegossen. Ich bin mir nicht sicher, ob die Ergebnisse abweichen, weil das Programm lief auf einem IA32 oder weil es irgendwo definiert, die in C-standard. Dennoch bin ich daran interessiert, wenn genau dieses Verhalten ist irgendwo definiert (ISO/IEC 9899?), weil ich gerne besser verstehen, warum und wenn ich casten manuell (ich habe Probleme die Portierung eines Programms von einer anderen Architektur).

InformationsquelleAutor azraiyl | 2010-08-16
Schreibe einen Kommentar