2009-02-23 7 views
3

J'ai enveloppé une méthode dll qui a un entier en tant que paramètre out dans un service Web. Lors des tests, je constatais que lorsque je m'attendais à -1, je recevais 65 535 à la place. Je me suis rendu compte que la DLL utilisait des entiers de 16 bits et je spécifiais l'entier .NET 32 bits standard en référençant la DLL externe dans mon code. ceci a été rapidement corrigé en spécifiant un entier de 16 bits et tout va bien.Pourquoi ce dépassement d'entier se produit-il?

Ma question est pourquoi est-ce arrivé? Je pourrais comprendre un débordement se produisant si j'essayais d'ajuster un entier de 32 bits dans un entier de 16 bits mais je ne suis pas si sûr que cela se produise dans l'autre sens. Il est clair que ma compréhension de ce type de casting entre les types fait un peu défaut, donc toute orientation sera grandement appréciée.

Répondre

6

Un entier de 16 bits "-1" a tous les 16 bits. Si vous définissez les 16 bits inférieurs d'un entier de 32 bits, la valeur est 65 535. Pour une explication de la représentation interne des nombres négatifs, jetez un oeil à this article.

+0

@Paul - Merci pour l'explication et le lien. Ensemble, ils l'ont bien expliqué. –

2

Ceci est dû au type de cast.

Vous n'envoyez pas réellement d'entiers 16 bits sur la pile d'appels - ils sont toujours en 32 bits. Alors, que la DLL retourne exactement était:

0x0000ffff 

Si vous lancez ce à, par exemple sint16, il s'agit de -1, mais s'il s'agit de 32 bits, il s'agit de 65535.

Questions connexes