En C, le type utilisé pour un calcul est déterminé à partir du type des opérandes , et non du type dans lequel vous stockez le résultat.
Les constantes entières simples telles que 100000
sont de type int
, car elles s'insèrent à l'intérieur d'une seule. La multiplication de 100000 * 100001
ne correspondra pas, de sorte que vous obtenez un débordement d'entier et un comportement indéfini. Passer à long
ne résoudra pas forcément quoi que ce soit, car cela pourrait aussi être 32 bits.
De plus, l'impression d'un int
avec le spécificateur de format %lld
est également un comportement indéfini sur la plupart des systèmes.
La racine de tout mal est ici les types par défaut de merde en C (appelés "types de données primitifs" pour une raison). Il suffit de se débarrasser d'eux et toutes leurs incertitudes, et tous vos insectes vont disparaître avec eux:
#include <stdio.h>
#include <inttypes.h>
int main(void)
{
printf("%"PRIu64, (uint64_t)100000 * (uint64_t)100001);
return 0;
}
ou équivalent: UINT64_C(100000) * UINT64_C(100001)
.
On dirait que vous êtes sur une plate-forme où 'int' est 32 bits (ou à peu près, mais 32 est le plus probable). Vous devrez utiliser un type de données plus large. –