3

Web サービスで out パラメータとして整数を持つ dll メソッドをラップしました。テストでは、-1 を期待していたときに、代わりに 65,535 を取得していることがわかりました。dll が 16 ビット整数を使用していて、コードで外部 dll を参照するときに標準の .NET 32 ビット整数を指定していたことに気付きました。これは、16 ビット整数を指定することですぐに修正され、すべて問題ありません。

私の質問は、なぜこれが起こったのですか?32 ビット整数を 16 ビット整数に合わせようとすると、オーバーフローが発生することは理解できましたが、なぜこれが逆に発生するのかはよくわかりません。明らかに、このタイプのタイプ間のキャストに関する私の理解は少し不足しているため、ガイダンスをいただければ幸いです。

4

2 に答える 2

6

16 ビット整数 "-1" には、16 ビットすべてが設定されています。32 ビット整数の下位 16 ビットを設定すると、値は 65,535 になります。負の整数の内部表現の説明については、この記事をご覧ください。

于 2009-02-23T15:30:31.307 に答える
2

これは、型キャストが原因で発生しました。

コール スタックで実際に 16 ビット整数を送信するわけではありません。それらは 32 ビットのままです。したがって、DLL が正確に返したのは次のとおりです。

0x0000ffff

これをたとえば にキャストするとsint16、これは-1になりますが、これが 32 ビットの場合、これは になり65535ます。

于 2009-02-23T15:31:35.237 に答える