I'm really stumped on this one. I'm coding in C# for Windows Phone 7.5; I am taking text from a text box, parsing it into an array, then converting each array element into an Int32 using Convert.ToInt32, then running the resulting Int32 values through a series of mathematical calculations, multiplying and adding the Int32 values to hardcoded numbers (all dependent upon what's selected in the UI).
All is well until I take the resulting calculations and multiply them together: I'm getting a negative number from multiplying two positive numbers! This is the only time I am doing any calculations with both of the numbers that originated in the method that uses the Convert.ToInt32 function. When they're added, subtracted, or even divided, the math comes out correctly. But when they're multiplied, no dice. The math is totally wrong; I double checked the math in LibreOffice Calc and it doesn't match. When stepping through the code, everything's correct until the numbers that originated in the method that uses the Convert.ToInt32 function are multiplied together. Any ideas?
The numbers are probably large enough to overflow
Int32.MaxValue
.Consider:
The reason for this is that negative integers are represented with a
1
in the largest bit, so any multiplication which is larger than the maximum value will have a1
in this position, which is interpreted as a negative value.Overflow is a danger with all integral types (
int
,short
,byte
,sbyte
,char
,long
,ulong
,ushort
, anduint
). You could use a floating point type, likefloat
ordouble
, but this comes with other problems, like rounding and equality issues. You have to know what kind of numbers you expect, then you might use other types likelong
,uint
,ulong
or a floating point type likedouble
ordecimal
. Ultimately, if you don't know what could happen, you need to write guard code on the input (e.g. wrap it in achecked { }
block [thanks, @EricLippert]), and handle it when it is a value outside the range you've designed for.EDIT: Another option in .Net 4.0+ is to use
System.Numerics.BigInteger
, which avoids any overflow, but can be slow.Its probably a Integer overflow exception. It can occur even if you are storing the number in a variable that is big enough. Example(long,double etc)
You can cast them before the sum and get the correct result
The quick and dirty solution is just to cast one of the values to a
long
and then cast the result back toint
, if possible.Edit: There is no need to use
BigInteger
for this case asint x int
can never overflow along
.