Question

J'ai créé une application de console de base pour faire un tel test.

        short val = 32767;

        val++;

        Console.WriteLine(val);

Cela me donne -32768 comme résultat attendu

        short val = 32767;

        val = val +1;

        Console.WriteLine(val);

Mais cela me donne cette erreur

L'erreur 1 ** ne peut pas convertir implicitement le type «int» en «short». Une conversion explicite existe (manquez-vous un casting?)

Je suis curieux de savoir ce qui cause cela?

Merci d'avance,

Était-ce utile?

La solution

Le résultat d'un short + short L'opération est définie comme un int. Dans le premier cas, le compilateur va de l'avant et applique un (short) jeté sur le résultat de l'augmentation, mais ce n'est pas dans le second.

short myShort = 1;
int resultA = myShort + myShort; // addition returns an integer
short resultB = myShort++; // returns a short, why? 

// resultB is essentially doing this
short resultB = (short)(myShort + 1);

En plus du lien fourni par Joel dans les commentaires, vous pouvez également vous référer à la section 7.3.6.2 de la C # 4.0 Spécification de la langue qui présente les règles des promotions numériques binaires (couvrant les expressions de la forme a = b + c;) et également 7.6.9 qui couvre les opérateurs pré et postfix.

Autres conseils

Ajout de deux shortS retournera un int.

La += et ++ les opérateurs se comporter différemment et travailler comme prévu.

Le résultat de l'ajout de deux shorts, ou un court et un INT, comme dans votre cas, est toujours de type INT, qui doit être converti à court pour être affecté à VAL.

La raison pour laquelle cela en est ainsi est que la somme de deux shorts, ou un court et un INT peut ne pas s'adapter à court, c'est toujours Int. Considère ceci;

short x = 30000;
short y = 30000;

int z = x+y; // would you really want to get a number other than 60000 here?  
short s = (short)(x+y); //if you want modulo 2^16

La 1 Dans votre ligne:

val = val +1;

est un int implicitement, donc le résultat de val + 1 est un int. Vous essayez d'attribuer cette valeur un court, et cela ne peut pas être fait implicitement parce que vous risquez de perdre une certaine précision.

Utilisant val + 1 fait penser que c'est un entier.

Utilisant:

    short val = 32767;

    val = (short) (val + 1);

    Console.WriteLine(val);

Devrait marcher.

L'évaluation des nombres par défaut est INT (INT32).

Dans votre cas ici, vous essayez d'ajouter un court (int16) à un type int (int32). Cela lance correctement une erreur.

val = val +1;

Ici, 1 est de type int Ainsi val + 1.

Quand tu cours val++, vous incrémentez simplement la valeur stockée dans la variable.

Quand tu cours val=val+1, 1 est un int Par défaut, le compilateur considère les deux valeurs ints et renvoie un int avec la valeur val+1. Ensuite, il ne parvient pas à le remettre dans val parce qu'un int est trop grand pour stocker en un court.

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