Compte tenu de l'extrait suivant:long long vs multiplication int
#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 sortie avec MinGW GCC 3.4.5 est (-O0):
1
4
8
10000
-1486618624
La première multiplication est coulé à l'intérieur d'un int32 (selon la sortie de l'assembleur). La deuxième multiplication n'est pas castée. Je ne suis pas sûr si les résultats diffèrent parce que le programme fonctionnait sur un IA32, ou parce qu'il est défini quelque part dans le standard C. Néanmoins je m'intéresse si ce comportement exact est défini quelque part (ISO/IEC 9899?), Parce que j'aime mieux comprendre pourquoi et quand je dois lancer manuellement (j'ai des problèmes en transférant un programme d'une architecture différente).
Très bien placé. @azraiyl devrait changer cette ligne à 'int64 f = (int64) d * e;' –
Désolé que je n'ai pas déclaré que je connais la solution ici. Ce qui m'intéresse, c'est pourquoi la multiplication est int32 * int32 dans le premier cas et non int8 * int8. Même si la CPU ne supporte que la multiplication int32, elle peut être renvoyée à un int8 après la multiplication. Mais l'instruction IA32 Imul fonctionne pour les registres 8 bits (AL, ...). – azraiyl
@azrayl: Au moins dans C90, C promu tous les opérandes arithmétiques à 'int' s'ils étaient de plus petits types. Un coup d'œil à la norme C99 suggère que ce n'est plus le cas, mais je ne suis pas vraiment sûr. Quel compilateur C utilisez-vous et, le cas échéant, avec quelles options? –