Почему происходит это целочисленное переполнение? - PullRequest
3 голосов
/ 23 февраля 2009

Я обернул метод dll, который имеет целое число в качестве параметра out в веб-сервисе. При тестировании я обнаружил, что когда я ожидал -1, я получил 65 535 вместо этого. Я понял, что dll использует 16-битные целые числа, и я указывал стандартное 32-битное целое число .NET при ссылке на внешнюю dll в моем коде. это было быстро исправлено путем указания 16-битного целого числа, и все хорошо.

Мой вопрос: почему это произошло? Я мог бы понять переполнение, возникающее, если я пытался вписать 32-битное целое число в 16-битное целое, но я не очень уверен, почему это происходит наоборот. Понятно, что мое понимание этого типа приведения между типами немного отсутствует, поэтому любые указания будут высоко оценены.

Ответы [ 2 ]

6 голосов
/ 23 февраля 2009

16-битное целое число «-1» имеет все 16 установленных битов. Если вы установите нижние 16 бит 32-разрядного целого числа, значение будет равно 65 535. Для объяснения внутреннего представления отрицательных целых, посмотрите на эту статью .

2 голосов
/ 23 февраля 2009

Это произошло из-за приведения типов.

На самом деле вы не отправляете 16-битные целые числа в стек вызовов - они все еще 32-битные Так что DLL вернула точно было:

0x0000ffff

Если вы разыгрываете это, например, sint16, это -1, но если это 32-битное, это 65535.

...