short val1 = short.MaxValue;
short val2 = short.MaxValue;
int result = val1;
result |= val2 << 16;
Console.WriteLine("Result =\t" + result); //2147450879
Console.WriteLine("Expected =\t" + int.MaxValue); //2147483647
Répondre
Cela ressemble à C#. Short est signé. Une valeur négative signée étendue à int remplira tous les 16 bits les plus à gauche. Ainsi, le code proposé échouera si "val1" est négatif.
Ce code fonctionne (notez que WORD et DWORD sont des quantités non signées):
public static uint MakeDWord(ushort a, ushort b) {
return ((uint)a << 16) | b;
}
short
est signé, la valeur maximale est 0x7FFF
. Concaténé cela donne 0x7fff7fff
au lieu de 0x7fffffff
qui est 2147450879. Donc ce que vous voyez est réellement correct.
C'est ce que vous avez besoin
ushort val1 = ushort.MaxValue;
ushort val2 = ushort.MaxValue;
int result = val1;
result |= val2 << 15;
hey pourquoi une downvote? vous obtenez la valeur attendue ici ... – Fredou
Cette réponse est toujours fausse. La raison en est que vous fusionnez le bit 15 de val1 avec le bit 0 de val2. En général, vous souhaitez rester non signé lorsque vous effectuez des opérations de déplacement et d'arithmétique. Les valeurs signées sont généralement bonnes pour l'arithmétique régulière, bien que vous vous en tiriez avec les opérateurs de changement de vitesse tant que vous savez que le domaine des nombres est positif ou nul. Mais si vous le savez, pourquoi ne pas le rendre non signé? –
bien que vous faites pour ce cas particulier. En général, cependant, vous voudriez << 16 pour que val2 tombe dans la moitié supérieure du résultat. De plus, si votre résultat est un entier signé, il pourrait être plus logique que val2 soit signé aussi vous obtiendrez int.MaxValue au lieu de -1 – Grizzly
essayer cela, semblable à MAKEWORD dans < Windef.h>:
#define MAKEDWORD(_a, _b) ((DWORD)(((WORD)(((DWORD_PTR)(_a)) & 0xffff)) | ((DWORD)((WORD)(((DWORD_PTR)(_b)) & 0xffff))) << 16))
- 1. Comment faire correspondre un des deux mots dans une expression régulière?
- 2. Correspondant à deux mots suivants avec une regex?
- 3. Comment inverser l'ordre de deux mots dans une chaîne?
- 4. Comment faire pivoter deux UIView?
- 5. Comment faire glisser deux DIVs?
- 6. Extraction des mots communs entre deux paragraphes?
- 7. Comment faire des mots dans une catégorie. (PNL)
- 8. Comment reconnaître deux mots différents dans un regex sans regroupement
- 9. Comment puis-je collecter les lignes entre deux mots clés?
- 10. Comment supprimer l'espace supplémentaire entre deux mots en utilisant C#?
- 11. Retirez les deux premiers mots d'une chaîne
- 12. Regexp MySql- Chaînes contenant uniquement deux mots
- 13. Comment puis-je compter le nombre de mots entre deux mots?
- 14. Python: comment faire deux listes à partir d'un dictionnaire
- 15. Comment faire pour emballer les mots dans Emacs?
- 16. Comment faire des recherches partielles de mots dans Lucene.NET?
- 17. gnu faire: Comment concat deux chaînes
- 18. .net Expression régulière pour faire correspondre deux mots séparés par une virgule ne fonctionne pas
- 19. RegEx - Faire correspondre un ensemble de mots
- 20. preg_replace_callback - faire deux fois
- 21. Comment faire une jointure avec deux tables?
- 22. comment faire un tableau de mots contenus dans une chaîne?
- 23. Comment puis-je utiliser LINQ pour faire correspondre les mots?
- 24. Comment faire pour que vimgrep fasse la recherche de mots?
- 25. comment faire pour échapper des mots clés dans C#?
- 26. Comment faire correspondre les mots Unicode avec ruby 1.9?
- 27. Trouver du texte Entre deux mots en Java
- 28. Expression régulière, trouver un mot entre deux mots
- 29. Inclure l'espace entre deux mots Javascript if() instruction
- 30. Table de jointure SQL avec deux mots clés 'ON'?
Pouvez-vous expliquer (1) * pourquoi * vous attendez le résultat incorrect, et (2) * ce que vous essayez de faire? –
J'essaye de fusionner deux mots signés dans un dword. Et c'est un test que je ne suis pas sûr de l'exactitude. –