Pourquoi un opérateur modulo (%) est-il implicitement coulé sur le côté gauche plutôt que sur le côté droit en C #?
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);
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.