unsigned long long int data_size = 60123456 * 128 * sizeof(double); // trouble-some code
Le type de destination unsigned long long int data_size =
n'est pas pertinent pour le produit de calcul 60123456 * 128 * sizeof(double)
.
Meilleur pour assurer des mathématiques se fait à l'aide d'au moins la taille de la cible type d'éviter les débordements. Dans l'OP, ça implique une constante avec LLU
.
Il y a 2 produits de calculs, chacun avec leur propre type de mathématiques.
60123456
est int
ou long
selon int
de la gamme. Nous supposons que c'est un int
.
60123456 * 128
est int * int
. Le calcul de produit 7695802368
dépasse 32 bits entier signé de gamme, donc signé débordement d'entier ou un comportement indéfini (UB) avec un 32 bits int
.
Si 60123456 * 128
n'a pas de débordement, dit-64-bit int
, plus de la prochaine multiplication serait * sizeof(double);
et ainsi de int * size_t
résultats en size_t
type de produit.
Produit de calcul doit utiliser au moins unsigned long long
mathématiques comme ci-dessous:
unsigned long long int data_size = 1LLU * 60123456 * 128 * sizeof(double);
// or
unsigned long long int data_size = 60123456LLU * 128 * sizeof(double);
// or
unsigned long long int data_size = 60123456;
data_size *= 128 * sizeof(double);
// or avoiding naked magic numbers
#define A_HEIGHT 60123456
#define A_WIDTH 128
unsigned long long int data_size = 1LLU * A_HEIGHT * A_WIDTH * sizeof(double);
L' sizeof (double)
conseils de ce code est d'essayer de trouver la taille de certaines 2D-forme de la structure. Je m'attends à un code comme suit. Notez le type de résultat de l' sizeof
est size_t
, de sorte que le produit de mathématiques se fait à l'aide d'au moins size_t
en mathématiques.
size_t data_size = sizeof(double) * 60123456 * 128;
printf("data_size= %zu\n", data_size);
Voir aussi Pourquoi écrire que 1 000 000 000 d'1000*1000*1000 en C?
et ma réponse raisons de ne pas utiliser 1000 * 1000 * 1000 pour les détails..