die folgenden Ausschnitt Gegeben:long long vs int Multiplikation
#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
Die erste Multiplikation mit einem int32 intern gegossen wird (entsprechend der Assemblerausgabe). Die zweite Multiplikation wird nicht gegossen. Ich bin nicht sicher, ob sich die Ergebnisse unterscheiden, weil das Programm auf einem IA32 ausgeführt wurde, oder weil es irgendwo im C-Standard definiert ist. Trotzdem interessiert mich, ob dieses genaue Verhalten irgendwo definiert ist (ISO/IEC 9899?), Weil ich gerne besser verstehe, warum und wann ich manuell casten muss (ich habe Probleme, ein Programm von einer anderen Architektur zu portieren).
Sehr gut gestellt. @azraiyl sollte diese Zeile in 'int64 f = (int64) d * e ändern;' –
Entschuldigung, dass ich nicht gesagt habe, dass ich die Lösung hier kenne. Was mich interessiert ist, warum Multiplikation im ersten Fall int32 * int32 ist und nicht int8 * int8. Selbst wenn die CPU nur eine Int32-Multiplikation unterstützt, kann sie nach der Multiplikation wieder in ein int8 umgewandelt werden. Der IA32-Imul-Befehl arbeitet jedoch für die 8-Bit-Register (AL, ...). – azraiyl
@azrayl: C förderte zumindest in C90 alle arithmetischen Operanden zu "int", wenn sie von kleineren Typen waren. Ein Blick auf den C99-Standard legt nahe, dass dies nicht mehr der Fall ist, aber ich bin mir nicht wirklich sicher. Welchen C-Compiler benutzen Sie und ggf. welche Optionen? –