Почему происходит это целочисленное переполнение?
-
06-09-2019 - |
Вопрос
Я обернул метод dll, который имеет целое число в качестве выходного параметра в веб-службе.Во время тестирования я обнаружил, что, когда я ожидал -1, вместо этого я получил 65 535.Я понял, что dll использует 16-битные целые числа, и я указывал стандартное 32-битное целое число .NET при ссылке на внешнюю dll в своем коде.это было быстро исправлено путем указания 16-битного целого числа, и все в порядке.
Мой вопрос: почему это произошло?Я мог бы понять, что происходит переполнение, если бы пытался поместить 32-битное целое число в 16-битное целое, но я не совсем уверен, почему это происходит наоборот.Очевидно, что мне немного не хватает понимания этого типа приведения между типами, поэтому мы будем очень признательны за любые рекомендации.
Решение
Для 16-битного целого числа «-1» установлены все 16 бит.Если вы установите нижние 16 бит 32-битного целого числа, значение составит 65 535.Для объяснения внутреннего представления отрицательных целых чисел посмотрите Эта статья.
Другие советы
Это произошло из-за приведения типов.
На самом деле вы не отправляете 16-битные целые числа в стек вызовов — они все еще 32-битные.Итак, что вернула DLL точно был:
0x0000ffff
Если вы примените это, например. sint16
, Это -1
, но если это 32-бит, то это 65535
.