7
votes

Comment supprimer C # AVERTISSEMENT CS0675: Opérateur bitwise utilisé sur un opérande étendu

Je n'arrive pas à vous débarrasser de cet avertissement pour la ligne de code suivante: xxx pré>

L'avertissement s'applique au code après l'opérateur d'attribution. La méthode getword renvoie une ulong. J'ai essayé ce qui suit n'est pas disponible: P>

d.word[wrdIndex++] = (d.GetWord(english) | (ulong)i);
d.word[wrdIndex++] = d.GetWord(english) | ((ulong)i);
d.word[wrdIndex++] = ((ulong)d.GetWord(english)) | ((ulong)i);


0 commentaires

3 Réponses :


2
votes

Désolé, je viens de me débarrasser de cela:

ulong w = d.GetWord(english);
ulong u = (ulong)i;
d.word[wrdIndex++] = w | u;


1 commentaires

Comme indiqué ci-dessus, si i est négatif, votre code se cassera (car le reste de u contiendra 0xffffffff, et donc le d.geword (anglais) La valeur sera entièrement perdue au lieu d'être combinée avec i ).



17
votes

Mise à jour : Cette question a été le sujet de mon blog le lundi 29 novembre 2010:

Lien

Merci pour la grande question!

Vous vous débarrassez de l'avertissement en pensant d'abord à l'avertissement et à décider si le compilateur a raison de faire votre attention sur votre attention! Êtes-vous en fait allez-vous obtenir des résultats incorrects du bitwise ou si la conversion d'un type signé sur un type de type non signé plus grand-étendre l'entier?

Si la réponse est oui alors votre solution est fausse. N'en éliminez pas l'avertissement en trompant le compilateur pour toujours faire la mauvaise chose sans vous donner l'avertissement. Éliminez l'avertissement en faisant la bonne chose: N'utilisez pas une conversion qui signer étend l'entier.

Si la réponse est no et que vous veux l'extension de signe que votre solution ou la solution de HANS Passant est correcte. Cependant, je mettrais un commentaire à cet effet dans le code, car tel qu'il se trouve, il est difficile de voir que l'extension de signe est souhaitable.


3 commentaires

Le code fait certainement ce qu'il devrait (et c'est la bonne façon de faire ce que je veux dans ce cas, je pense) - je suis juste surpris que le 2e des 3 tentatives: d.geword (anglais) | ((ulong) i) fournit toujours l'avertissement que le ((ulong) i) est jeté à une ulong avant que le bit ou l'opérateur soit appliqué, non?


Ah, maintenant je l'obtiens - c'est en fait assez intelligent du compilateur pour m'empêcher de cela, je suppose. Existe-t-il un moyen de se lancer à Ulong sans extension de signe (autre que de masquer le sommet du sommet manuellement)?


couler à Uint en premier. (ulong) (uint) i



8
votes
int i=-1;                 // =         0xFFFFFFFF
ulong u1=(ulong)i;        // = 0xFFFFFFFFFFFFFFFF
ulong u1a=(ulong)(long)i; // = 0xFFFFFFFFFFFFFFFF
ulong u2=(ulong)(uint)i;  // = 0x00000000FFFFFFFF
So a cast from int to ulong corresponds to first sign-extending to (signed) long, and then casting away the sign.

1 commentaires

Cela devrait être la réponse acceptée, beaucoup plus claire sans la verbosité, une image vaut mille mots