2011-03-09 2 views
3

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

Спасибо!

+0

Это из-за переполнения целого числа. – BoltClock

+0

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

+1

@invalidsyntax: Это не по умолчанию окно, а язык. Некомпозированный целочисленный литерал интерпретируется как Int32 в C#. –

ответ

0

Попробуйте ввести следующее:

174 * 256 * 256 * 256f 

поэтому результат не извергаются в целое, но, как поплавок.

4

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

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

174L * 256L * 256L * 256L 

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

+0

Интересно. Почему не исключено исключение? –

+0

@Mike C .: Целочисленное умножение является инструкцией на уровне процессора, которая чрезвычайно быстро. Проверка для переполнения будет чрезмерно дорогой для такой операции низкого уровня. Математика с произвольным размером или произвольной точностью требует типов данных, которые не имеют фиксированного размера, которые часто называют «большими». –

+5

@Mike C: Если вы хотите, чтобы целочисленная арифметика выдавала исключение при переполнении в вашей программе C#, тогда (1) «x = checked (a * b);», (2) «checked {x = a * b;}, или (3) в компиляторе есть переключатель «make checked default». Аналогичным образом «принудительно» отменяется, чтобы заставить противоположное поведение. –

0

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

+0

PS: Доступно в .NET 4.0 – jdehaan

1

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

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

0

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

0

Это простой переполнение. Попытайтесь ввести это в свое окно:

(uint)(174 * 256 * 256 * 256) 
Смежные вопросы