2015-02-24 2 views
1

Je souhaite convertir une valeur Int32 en valeur Int16. Les données perdues lors du casting ne sont pas un problème pour moi. Mais un System.OverflowException dit que la valeur du type Int16 est trop grande ou trop petite.Impossible de convertir int32 en int16. La valeur du type Int16 est trop grande ou trop petite

Dim num As Int32 = &HFFFFFFF 
Dim num2 As Int16 = Convert.ToInt16(num) 
Debug.WriteLine(num.ToString("X4")) 
Debug.WriteLine(num2.ToString("X4")) 

Si je veux jeter un Int32 & HFFFFFFF à & HFFFF que dois-je faire.

Toute aide serait appréciée.

+2

J'ai corrigé votre balise - 'OverflowException' et' StackOverflowException' sont * très * différents. –

+0

Vous obtenez l'erreur overflowException car votre valeur int32 est supérieure à Int16.MaxValue ou inférieure à Int16.MinValue. –

+0

IMO Si je dois vérifier la limitation ou utiliser try..catch avant le casting, ce ne serait pas très agréable car le code sera plus long. –

Répondre

1

Je pense, comme je l'ai dit dans mon commentaire, que votre distribution est invalide parce que int16 a maxValue et MinValue que votre int32 ne se trouve évidemment pas entre les deux.

Essayez ce qui suit pour voir votre erreur plus clairement:

Debug.WriteLine(Int16.MaxValue.ToString) 
Debug.WriteLine(Int16.MinValue.ToString) 
Debug.WriteLine(num.ToString) 

enter image description here

Votre meilleure solution est de couper le dernier 4 F votre int32 chaque fois que la conversion, si vous insistez toujours le faire:

Sub Main() 
     Dim num As Int32 = &HFFFFFFF 
     Dim num2 As Int16 = Convert.ToInt16(num.ToString("X8").Substring(num.ToString("X8").Length - 4, 4), 16) 
     Debug.WriteLine(num.ToString("X4")) 
     Debug.WriteLine(num2.ToString("X4")) 
     Console.ReadLine() 
    End Sub 
+0

Il produit 'FFFFFFF' et' 68DB' ​​depuis 'ToString' imprime chaîne décimale par défaut et 'Remove 'n'est pas tout à fait raisonnable ici. Je corrige la conversion en Dim num2 As Int16 = Convert.ToInt16 (num.ToString ("X8"). Substring (num.ToString ("X8"). Longueur - 4, 4), 16) 'et cela fonctionne. Merci! –

+0

Je vais accepter votre réponse si vous pouvez le corriger pour produire la bonne sortie. 1+ pour l'information –

+0

@QuangYen: Voilà. –

1

Si vous pouvez ignorer OverflowException pendant l'incantation des opérations arithmétiques (y compris la division par zéro) sur l'ensemble de votre projet, je vous suggère de définir l'option du compilateur /removeintchecks.

Pour définir/removeintchecks dans le développement intégré Visual Studio environnement

  1. Sélectionnez un projet dans l'Explorateur de solutions. Dans le menu Projet, cliquez sur Propriétés. Pour plus d'informations, voir Introduction au concepteur de projet.
  2. Cliquez sur l'onglet Compiler.
  3. Cliquez sur le bouton Avancé.
  4. Modifiez la valeur de la case à cocher Supprimer les débordements d'entier.

Et, Convert.ToInt16() génère toujours le OverflowException indépendamment de cette option. Pour bénéficier de cette option, vous pouvez utiliser CType ou CShort à la place.

Dim num As Int32 = &HFFFFFFF 
Dim num2 As Int16 = CType(num, Int16) 
Debug.WriteLine(num.ToString("X4")) 
Debug.WriteLine(num2.ToString("X4"))