![](/img/trans.png)
[英]C# GetHashCode with two Int16, also returns only up to Int32?
[英]Multiplying two positive Int32 returns incorrect, negative answer?
我真的很为难。 我使用Windows Phone 7.5的C#进行编码; 我正在从文本框中获取文本,将其解析为数组,然后使用Convert.ToInt32将每个数组元素转换为Int32,然后通过一系列数学计算运行所得的Int32值,并将Int32值相乘并将其添加到硬编码数字中(全部取决于在UI中选择的内容)。
一切顺利,直到我将所得的计算结果乘以它们:我将两个正数相乘得到一个负数! 这是我唯一一次使用源自使用Convert.ToInt32函数的方法的两个数字进行任何计算的情况。 将它们相加,相减甚至相除后,数学计算就正确了。 但是当它们相乘时,就没有骰子。 数学是完全错误的。 我仔细检查了LibreOffice Calc中的数学,但不匹配。 单步执行代码时,直到将使用Convert.ToInt32函数的方法中起源的数字相乘在一起,一切都是正确的。 有任何想法吗?
这些数字可能足够大, Int32.MaxValue
溢出Int32.MaxValue
。
考虑:
var r = Int32.MaxValue / 2; // r = 1073741823
var ans = r * 3; // ans = -1073741827
原因是负整数在最大位用1
表示,因此任何大于最大值的乘法在该位置都将有1
,这被解释为负值。
所有整数类型( int
, short
, byte
, sbyte
, char
, long
, ulong
, ushort
和uint
)都有溢出的危险。 您可以使用浮点类型,例如float
或double
,但这会带来其他问题,例如舍入和相等问题。 您必须知道期望使用哪种数字,然后才能使用其他类型,例如long
, uint
, ulong
或浮点类型(例如double
或decimal
。 最终,如果您不知道会发生什么,则需要在输入上编写保护代码(例如,将其包装在checked { }
块中[感谢@EricLippert] ) ,并在该值超出范围时进行处理。您设计的。
编辑:.Net 4.0+中的另一个选项是使用System.Numerics.BigInteger
,它避免了任何溢出,但速度可能很慢。
快速而肮脏的解决方案是将值之一转换为long
,然后将结果转换回int
(如果可能)。
编辑:在这种情况下,无需使用BigInteger
,因为int x int
永远不会long
溢出。
它可能是整数溢出异常。 即使您将数字存储在足够大的变量中,也会发生这种情况。 示例(长,双等)
int one = int.MaxValue;
int two = int.MaxValue;
long sum = (long)(one + two); //Returns -2, because the cast was after the sum
//(long) -2.
您可以将它们强制转换为总和,以获得正确的结果
int one = int.MaxValue;
int two = int.MaxValue;
long sum = (long) one + (long)two; //Returns 4294967294, it casts both the
//integer to long and then adds them
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.