Ce code ne peut pas être compilé en raison de déborder: mais celui-ci donne une valeur de 1 à cause de la même raison que de déborder: p> Ma question est la raison pour laquelle le premier exemple donne une erreur et le second ne sera pas? p> p>
4 Réponses :
octet code> est 0 à 255 code> h2>
Dans le premier exemple, lorsque vous attribuez Dans le deuxième exemple, vous attribuez numéro = 1000 code> il dépasse la limite de la plage d'octets et donne une erreur de temps de compilation. P>
numéro = 255 code> qui est acceptable comme 255 code> est dans la plage d'octets. Lorsque vous ajoutez 2 code> à max octet limite IE 255 code>, il commence par 0 code> et imprime 1 code> en conséquence p>
Le premier ne compile pas car un octet code> ne peut pas être défini sur à aucun point dans le deuxième exemple, essayez-vous de définir un octet code> sur Fondamentalement, le compilateur ne va pas essayer de calculer votre débordement pour vous. Le temps d'exécution gérera un débordement. P> 1000 code>. La seconde compile parce qu'un octet code> peut être réglé sur 255 code>, et comme une valeur débordera lors de l'exécution de l'arithmétique qui le prend au-delà de ses limites . p>
1000 code>. Chaque opération présente dans le deuxième exemple est valide. Mais une opération dans le premier exemple n'est pas valide. P>
A Donc, si vous mettez 8 bits d'affilée, vous pouvez commencer à représenter des nombres en binaire: p> Au fur et à mesure que d'autres personnes ont souligné, lorsque vous ajoutez 2 à 255, il déborde et enveloppe: p> Vous avez besoin d'une primitive plus grande, une avec au moins 10 bits, Pour représenter un numéro comme 1000 et votre compilateur le sait et essaie de vous alerter. p> p> octet code> est de 8 bits et un peu peut être sur notre éteint. Représenté mathématiquement, ceci est 0 ou 1, éteint et sur respectueusement.
La divergence est due à Les règles entourant C # 'S vérifié code> et . non coché code> contextes
Valeurs constantes (celles du compilateur peuvent déterminer à la compilation, à l'aide de règles bien définies de la spécification C #) par défaut sur cochée code>. Tentative d'attribution d'une valeur hors de portée d'un type numérique (dans votre cas, attribuer 1000 code> à un octet code>, qui a la plage [0,255] code >) entraînera une erreur de compilation. Vous pouvez surpressez cela en enveloppant l'expression dans un contexte code> non vérifié. P>
checked {
byte number = 255;
number += 2;
Console.WriteLine(number);
}
Le premier essaie de jeter un
int code> à unoctet code> où la valeur est en dehors de la taille deoctet code>. La seconde est juste d'autoriser un octet code> existant code> d'avoir une valeur de valeur de la valeur en fonction de la configuration par défaut du débordement non coché."Ce code ne peut pas être compilé à cause de déborder" i> n'est pas vraiment correct. Le débordement, par définition, arrive au moment de l'exécution. Le compilateur vous indique que la valeur constante ne peut pas être convertie en octets car il est trop grand.
FYI, les échantillons de code seraient légèrement meilleurs si nous utilisions
257 code> au lieu de1000 code> (pour la cohérence entre les exemples)