Entier additionnant les blues, court += petit problème
Programme en C#:
short a, b;
a = 10;
b = 10;
a = a + b; //Error : Cannot implicitly convert type 'int' to 'short'.
//we can also write this code by using Arithmetic Assignment Operator as given below
a += b; //But this is running successfully, why?
Console.Write(a);
- La première échoue à cause de courtes + short = int telle que définie dans le cahier des charges, tout comme octet + octet = int, cependant j'aurais attendu la deuxième aussi un échec, donc je suis impatient de voir le raisonnement ici.
- avez-vous trouvé une raison quelconque ?
- Cela est répondu de façon aussi détaillée que possible ci-dessous par Eric Lippert, donc je ne suis pas vraiment sûr de ce que votre demande ici. En bref est parce que
a += b
est le même quea = (short)(a+b)
- Double Possible de byte + octet = int... pourquoi?
Vous devez vous connecter pour publier un commentaire.
Il y a deux questions ici. La première est: "pourquoi est court, plus court entraîner int?"
Eh bien, supposons que court, plus court a été de courte et de voir ce qui se passe:
Et la moyenne est, bien sûr, -9845 si ce calcul est effectué en short. La somme est plus grande que la plus grande possible, en bref, il s'enroule autour de négatif, et puis vous divisez le nombre négatif.
Dans un monde où l'arithmétique entière s'enroule autour de il est beaucoup plus judicieux de faire tous les calculs en int, un type qui est susceptible d'avoir assez de gamme typique de calculs, pas de débordement.
La deuxième question est:
La question a une prémisse inexacte; la troisième ligne ci-dessus est faux. La spécification C# états dans la section 7.17.2
Le compilateur insère la fonte sur votre nom. Le bon raisonnement est:
Si elle n'a pas insérer de la fonte pour vous, alors il serait impossible d'utiliser des raccourcis sur de nombreux types.
short
avecint
tout fonctionne correctement, mais si nous mettons plus grand nombre (pour faire de la somme doit être supérieur à 2^31), il sera la cause int débordement. ma question est pourquoishort + short = int
(et pourbyte
) etint + int = int
(pas longtemps par exemple).short
etint
.Bien, le
+=
opérateur dit que vous serez l'augmentation de la valeur dea
avec un short, tout=
dit que vous aurez remplacer la valeur, avec le résultat d'une opération. L'opérationa + b
donne un int, ne sachant pas qu'il peut faire autrement, et que vous essayez d'assigner l'int d'un court-circuit.+=
était juste une abréviation!=
opérateur affecte une nouvelle valeur (dans ce cas, le mauvais type), mais le+=
utilise une mise en œuvre différente (c'est à dire, il ajoute comme nous le prévoyons, à l').a+=b
=a=a+b
à moins que l'opérateur += est surchargé, et il semble qu'il est de typeshort
, et il n'y a pas+
pourshort
,shortA + shortB
s'élargit et devient(int)shortA + (int)shortB
.Vous devez utiliser:
À la différence entre les comportements d'attribution et d'affectation d'addition, j'imagine que ça a quelque chose à voir avec cela (à partir de msdn)
Cependant, c'est un peu vague, donc mabye quelqu'un avec une compréhension plus profonde peut commentaire.
Cela se produit parce que l'int est le plus petit type signé pour qui
+
est défini. Rien de plus petit est le premier promu en int. Le+=
opérateur est défini à l'égard de+
, mais avec un cas spécial de la règle de gestion des résultats qui ne correspondent pas à la cible.C'est parce que += est mis en œuvre comme une fonction surchargée (dont l'un est courte, et le compilateur choisit le plus spécifique de la surcharge). Pour l'expression (a + b), le compilateur s'élargit le résultat d'un int par défaut avant de l'affecter.