Quelqu'un peut-il expliquer pourquoi le suivant ne compile pas?
byte b = 255 << 1
L'erreur:
La valeur de la constante '510' ne peut pas être converti en 'octet'
J'attends la suite en binaire:
1111 1110
La conversion de type est perplexe moi.
OriginalL'auteur Chris S | 2009-04-10
Littéraux numériques en C# sont
int
, pasbyte
(et le décalage de bits sera évalué par le compilateur, ainsi que les 510 reste). Vous êtes donc essayez d'affecter une valeur à unebyte
qui ne sont pas adaptés. Vous pouvez masquer avec 255:à réduire le résultat à 8 bits de nouveau. Contrairement à Java, C# ne permet pas de dépassements d'aller par inaperçue. Fondamentalement, vous auriez deux des options sensibles lorsque vous essayez d'attribuer 510 à un octet: Soit de serrage à la valeur maximale, puis vous obtenez 255, ou de jeter les bits qui ne rentre pas, dans ce cas, vous obtiendrez 254.
Vous pouvez également utiliser
unchecked
, comme lassevk mentionné:Eh bien, 255 correspond, tout ce qui précède n'est pas le cas 🙂
Il convient de noter, comme je l'ai été poussé ici à partir d'un autre thread, que même si vous disposez de deux octets, toute opération au niveau du bit sur leur renvoie un int.
Question bête, pourquoi utilisez-vous une représentation hexadécimale de 255 au lieu de simplement en utilisant 255?
L'habitude lors de l'utilisation de numéros masques de bits. Si vous êtes
and
-ing ouor
-ing avec un numéro que vous ne se soucient pas de sa représentation décimale; vous voulez voir immédiatement ce que les bits sont définis et qui ne le sont pas.OriginalL'auteur Joey
Vous êtes en déplacement 255 par 1 bit, puis d'essayer de les affecter à un octet.
255 << 1 is 510
, et 510 ne rentre pas dans un octet.OriginalL'auteur Steve Haigh
OriginalL'auteur Michael Burr
Le résultat de la
<<
opérateur est unInt32
, pas ce que vous mettez dedans.Vous avez besoin pour lancer la suite de ce changement, pas l'entrée. En outre, il va produire un dépassement de capacité (il est plus grand qu'un octet après tout), vous devez indiquer que vous avez besoin d'un décoché exprimés.
En d'autres termes, cela fonctionne:
OriginalL'auteur Lasse Vågsæther Karlsen
avez-vous essayé de casting?
Cette approche est intéressante - le code ci-dessus fonctionne, emballé dans un
unchecked
bloc comme ceci:Car il est
unchecked
la valeur est tronquée à la valeur de 254. Donc, il est possible de le faire avec un plâtre!Peut-être vous voulez dire (byte)(255 << 1) ?
essayez: byte b = (255 << 1) & 0xff;
Joel est correcte - voir Michael Burr réponse.
casting n'est pas la solution à tout 😉
OriginalL'auteur Daniel A. White
vous donnera plus d'un octet.
OriginalL'auteur Otávio Décio
Et depuis << a une priorité plus élevée que & vous pouvez enregistrer les parenthèses:
OriginalL'auteur sipwiz