Je veux convertir long
à int
.
Si la valeur de long
> int.MaxValue
, je suis heureux de la laisser s'enrouler.
Quel est le meilleur moyen?
c#
types
int
type-conversion
long-integer
en dépit
la source
la source
myIntValue
peut finir négatif quandmyLongValue
est positif (4294967294 => -2
) et vice-versa (-4294967296 => 0
). Ainsi, lors de l'implémentation d'uneCompareTo
opération, par exemple, vous ne pouvez pas convertir le résultat de la soustractionlong
de l'un à l'autre en unint
et le renvoyer; pour certaines valeurs, votre comparaison donnerait un résultat incorrect.new Random()
utiliseEnvironment.TickCount
sous le capot; pas besoin de semer manuellement avec des tics d'horloge.unchecked
donc, à moins que vous ne l'ayez explicitement modifié, leunchecked
mot - clé (comme indiqué dans cette réponse et le commentaire de @ ChrisMarisic, etc.) n'est pas nécessaire etint myIntValue = (int)myLongValue
est exactement équivalent. Cependant , ne note que peu importe si vous utilisez leunchecked
mot - clé ou non, vous obtenez le comportement de troncature grossier non-mathématique décrit par @TJCrowder où le signe peut retourner dans certains cas de débordement. La seule façon de vraiment garantir l'exactitude mathématique est d'utiliser lechecked(...)
contexte, où ces cas lèveront une exception.Bien que je ne sache pas ce qu'il fera quand il est supérieur à int.MaxValue.
la source
OverflowException
, ce qui est exactement ce que l'OP ne veut pas: msdn.microsoft.com/en-us/library/d4haekc4.aspxConvert
n'est pas bon.if (value > Int32.MaxValue)
return Int32.MaxValue;
else
return Convert.ToInt32( value );
Parfois, vous n'êtes pas vraiment intéressé par la valeur réelle, mais par son utilisation comme somme de contrôle / hashcode . Dans ce cas, la méthode intégrée
GetHashCode()
est un bon choix:la source
GetHashCode
c'est un choix approprié. Si vous recherchez une somme de contrôle persistante - une valeur qui sera la même lorsque vous exécuterez votre application plus tard, ne l'utilisez pasGetHashCode
, car il n'est pas garanti que ce soit le même algorithme pour toujours.Le moyen le plus sûr et le plus rapide est d'utiliser le masquage de bits avant de lancer ...
La valeur Bit Mask (
0xFFFFFFFF
) dépendra de la taille de Int car la taille Int dépend de la machine.la source
unchecked
contexte, vous n'obtiendrez pas de débordement - mais vous n'avez pas besoin de vous masquerunchecked
pour éviter le débordement, donc une solution n'est nécessaire que dans lechecked
contexte.] Exemple pour 16 bits. Signé 16 bits détient (-32768, 32767). Le masquage avec 0xFFFF permet une valeur jusqu'à 65535, provoquant un débordement, IIRC. Pourrait masquer pour éviter le bit de signe, 0x7FFF ou 0x7FFFFFFF, si vous voulez seulement positif.Il peut convertir en
Mais il lèvera une OverflowException si la valeur est en dehors de la plage du type Int32. Un test de base nous montrera comment cela fonctionne:
Ici, il y a une explication plus longue.
la source
Ne serait pas
être la bonne manière, mathématiquement parlant?
la source
longValue
plus proche représentableint
si la valeur d'origine est trop grande. Mais il lui manque le même traitement des entrées trop négatives, qui perdraient à la place les bits les plus significatifs; vous auriez besoin de comparerInt32.MinValue
aussi. L'affiche originale ne semblait pas vouloir de serrage, cependant.La solution suivante sera tronquée à int.MinValue / int.MaxValue si la valeur est en dehors des limites Integer.
la source
Un moyen possible consiste à utiliser l'opérateur modulo pour laisser uniquement les valeurs rester dans la plage int32, puis à les convertir en int.
la source