Question

J'essaie de construire un grand Int64 avec des informations stockées grignotage en octets.

Les lignes suivantes de travail de code comme prévu:

Console.WriteLine("{0:X12}", (Int64)(0x0d * 0x100000000));
Console.WriteLine("{0:X12}", (Int64)(0x0d * 0x1000000));
Console.WriteLine("{0:X12}", (Int64)(0x0d * 0x100000));

Pourquoi la tête de ligne suivante à une erreur de compilation CS0220 « L'opération déborde au moment de la compilation en mode contrôlé » et les autres ne le font pas?

Console.WriteLine("{0:X12}", (Int64)(0x0d * 0x10000000));

Le résultat serait:

FFFFFFFFD0000000

au lieu de:

0000D0000000

Quelqu'un peut-il expliquer cela? Je vais maintenant convertir avec des opérateurs de décalage, mais toujours curieux de savoir pourquoi cette approche ne fonctionne pas!

Mise à jour:. L'erreur se produit également lors de l'utilisation (Int64) (0x0D << 28)

Était-ce utile?

La solution

Vous devez marquer les valeurs constantes comme spécifiquement désire ardemment (Int64s) ou peut-être ulongs (UInt64s), sinon par défaut, ils seront interprète ints (à savoir INT32), ce qui provoque clairement les débordements. Coulée après l'opération de multiplication ne fera aucun bien dans ce cas.

ai pas testé, mais ce code devrait fonctionner:

Console.WriteLine("{0:X12}", 0x0dL * 0x100000000L);
Console.WriteLine("{0:X12}", 0x0dL * 0x1000000L);
Console.WriteLine("{0:X12}", 0x0dL * 0x100000L);

Autres conseils

littéraux entiers ont le type Int32 (même si dans l'hexagone). Utilisez le suffixe "L" pour les rendre désire ardemment (Int64).

Console.WriteLine("{0:X12}", 0x0dL * 0x100000000L);

D'abord coup d'oeil je suppose que ça fait la multiplication par un Int32, et le débordement. Vous devez jeter les opérandes individuels Int64 puis multiplier ceux-ci. En ce moment vous casting que le résultat.

Cela dit, je ne sais pas pourquoi il ne trouvera problème avec cette ligne et non le premier avec le plus grand nombre.

ND

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