Je n'arrive pas à vous débarrasser de cet avertissement pour la ligne de code suivante: 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);
3 Réponses :
Désolé, je viens de me débarrasser de cela:
ulong w = d.GetWord(english); ulong u = (ulong)i; d.word[wrdIndex++] = w | u;
Comme indiqué ci-dessus, si i code> est négatif, votre code se cassera (car le reste de
u code> contiendra 0xffffffff, et donc le
d.geword (anglais) code> La valeur sera entièrement perdue au lieu d'être combinée avec
i code>).
Lien p>
Merci pour la grande question! p>
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? strong> p>
Si la réponse est oui em> 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. P>
Si la réponse est no em> et que vous veux em> 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. P>
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 code>
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.
Cela devrait être la réponse acceptée, beaucoup plus claire sans la verbosité, une image vaut mille mots