0
votes

Pourquoi peut-on être compilé et l'autre pas?

Ce code ne peut pas être compilé en raison de déborder: xxx

mais celui-ci donne une valeur de 1 à cause de la même raison que de déborder: xxx

Ma question est la raison pour laquelle le premier exemple donne une erreur et le second ne sera pas?


3 commentaires

Le premier essaie de jeter un int à un octet où la valeur est en dehors de la taille de octet . La seconde est juste d'autoriser un octet existant 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" 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 au lieu de 1000 (pour la cohérence entre les exemples)


4 Réponses :


1
votes

plage de octet est 0 à 255

Dans le premier exemple, lorsque vous attribuez numéro = 1000 il dépasse la limite de la plage d'octets et donne une erreur de temps de compilation.

Dans le deuxième exemple, vous attribuez numéro = 255 qui est acceptable comme 255 est dans la plage d'octets. Lorsque vous ajoutez 2 à max octet limite IE 255 , il commence par 0 et imprime 1 en conséquence


0 commentaires

1
votes

Le premier ne compile pas car un octet ne peut pas être défini sur 1000 . La seconde compile parce qu'un octet peut être réglé sur 255 , et comme une valeur débordera lors de l'exécution de l'arithmétique qui le prend au-delà de ses limites .

à aucun point dans le deuxième exemple, essayez-vous de définir un octet sur 1000 . Chaque opération présente dans le deuxième exemple est valide. Mais une opération dans le premier exemple n'est pas valide.

Fondamentalement, le compilateur ne va pas essayer de calculer votre débordement pour vous. Le temps d'exécution gérera un débordement.


0 commentaires

0
votes

A octet 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.

Donc, si vous mettez 8 bits d'affilée, vous pouvez commencer à représenter des nombres en binaire: xxx

Au fur et à mesure que d'autres personnes ont souligné, lorsque vous ajoutez 2 à 255, il déborde et enveloppe: xxx

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.


0 commentaires

0
votes

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);
    }
    


0 commentaires