2009-02-23 2 views
3

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

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

ответ

6

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

+0

@Paul - Спасибо за объяснение и ссылку. Вместе они объяснили это красиво. –

2

Это произошло из-за литья типа.

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

0x0000ffff 

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

Смежные вопросы