Pourquoi un opérateur modulo (%) est-il implicitement coulé sur le côté gauche plutôt que sur le côté droit en C #?

StackOverflow https://stackoverflow.com/questions/5036592

  •  15-11-2019
  •  | 
  •  

Question

Prenez le code suivant:

long longInteger = 42;
int normalInteger = 23;
object rem = longInteger % normalInteger;

Si rem est le reste de longInteger / normalInteger, Le reste ne devrait-il pas toujours être délimité par le "int" de plus petite taille, le diviseur? Pourtant, en C #, le code ci-dessus entraîne rem être un long.

Est-il sûr de convertir rem à int Sans perte de données?

int remainder = Convert.ToInt32(rem);
Était-ce utile?

La solution

Il n'y a pas de surcharge de l'opérateur modulo qui prend un long Et un int, alors le int sera converti en long pour correspondre à l'autre opérande.

En le regardant à un niveau inférieur, dans le CPU, il n'y a pas d'instructions distinctes pour calculer le modulo, ce n'est que l'un des résultats de l'opération de division. La sortie de l'opération est le résultat de la division et du rappel. Les deux sont de la même taille, de sorte que le résultat de la division doit être un long, le rappel aussi.

Comme le rappel doit être plus petit que le diviseur, vous pouvez lancer le résultat en toute sécurité pour int Quand le diviseur vient d'un int.

Autres conseils

Peu importe ce que vos deux entiers, le résultat doit être inférieur à "Normal Integer". Par conséquent, le résultat "REM" sera contraint aux limites d'un type int. Ainsi, il sera sûr de convertir REM en int sans perte de données.

Oui, il n'a pas de problème, la fonction de converti va autour du résultat. Ensuite, vous devez savoir si c'est utile pour vous ou non.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top