2009-12-17 2 views
0
 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 
+1

Pouvez-vous expliquer (1) * pourquoi * vous attendez le résultat incorrect, et (2) * ce que vous essayez de faire? –

+0

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. –

Répondre

1

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; 
    } 
+0

devrait être << 15, non? – Fredou

+0

non il ne devrait pas, cela chevaucherait le premier bit de b avec le dernier d'un – Grizzly

8

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.

+4

Je pense que vous voulez dire que «court» est signé, non? –

+0

court est signé – Fredou

+0

Argh, oui. Pardon. Besoin de ... plus ... du thé. – Joey

1

C'est ce que vous avez besoin

 ushort val1 = ushort.MaxValue; 
     ushort val2 = ushort.MaxValue; 

     int result = val1; 
     result |= val2 << 15; 
+0

hey pourquoi une downvote? vous obtenez la valeur attendue ici ... – Fredou

+0

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é? –

+0

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

0

essayer cela, semblable à MAKEWORD dans < Windef.h>:

#define MAKEDWORD(_a, _b) ((DWORD)(((WORD)(((DWORD_PTR)(_a)) & 0xffff)) | ((DWORD)((WORD)(((DWORD_PTR)(_b)) & 0xffff))) << 16)) 
Questions connexes