Почему происходит это целочисленное переполнение?

StackOverflow https://stackoverflow.com/questions/577990

  •  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.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top