Проблема умножения с отладчиком Visual Studio для C # - PullRequest
3 голосов
/ 09 марта 2011

Если я введу 174 * 256 * 256 * 256 в окно просмотра в отладчике C #, результат будет
-1375731712. Я предполагаю, что это как-то связано с 256, но я был бы признателен за небольшое руководство.

Спасибо !!

Ответы [ 6 ]

4 голосов
/ 09 марта 2011

Нет, ничего общего с 256. Это просто результат того, что умножение больше, чем максимально возможное 32-разрядное целое число со знаком, поэтому вы получаете переполнение.

Попробуйте вместо этого:

174L * 256L * 256L * 256L

Это 64-битные целочисленные литералы.

1 голос
/ 09 марта 2011

Переполнение unchecked (поэтому переполнение без ошибки).Подумайте так: Int32.MaxValue + 1 == Int32.MinValue, но с умножением.

Это объясняет, как int представляется в памяти http://en.wikipedia.org/wiki/Two's_complement

0 голосов
/ 09 марта 2011

Это простое переполнение.Попробуйте ввести это в окне ваших часов:

(uint)(174 * 256 * 256 * 256)
0 голосов
/ 09 марта 2011

Вы переполняете целое число.Реальный ответ - 2 919 235 584, но только 2 217 483 647 можно представить как целое число со знаком.Рассмотрим неподписанное int (uint), long, ulong или, если оно недостаточно велико.Для окна просмотра вам, вероятно, придется привести первый аргумент или использовать суффикс, например, 174L * 256L * 256L * 256L

0 голосов
/ 09 марта 2011

Вы столкнулись с целочисленным переполнением. Вы можете использовать System.Numerics.BigInteger, если хотите работать с большими числами без ограничений (помимо доступной памяти, конечно). В вашем особом случае long также будет делать (64-битное целое)

0 голосов
/ 09 марта 2011

Попробуйте ввести это:

174 * 256 * 256 * 256f

поэтому результат будет приведен не к целому числу, а к числу с плавающей точкой.

...