当前位置: 首页 > 编程语言 > C#

将两个正Int32相乘返回错误的负答案?

时间:2023-04-11 10:58:53 C#

将两个正Int32相乘返回错误的负答案?我真的被这个难住了。我正在用C#编写WindowsPhone7.5;我从文本框中取出文本,将其解析为数组,然后使用Convert.ToInt32将每个数组元素转换为Int32,然后通过一系列数学计算运行生成的Int32值,将Int32值相乘并相加以硬编码数字(两者都取决于在UI中选择的内容)。一切都很好,直到我得到计算结果并将它们相乘:我将两个正数相乘得到一个负数!这是我唯一一次对从使用Convert.ToInt32函数的方法派生的数字进行任何计算。当它们被加、减甚至除时,数学运算正确。但是当它们相乘时,就没有骰子了。数学是完全错误的;我仔细检查了LibreOfficeCalc中的数学,结果不匹配。单步执行代码时,一切都是正确的,直到使用Convert.ToInt32函数的方法产生的数字相乘。有任何想法吗?这些数字可能大到足以溢出Int32.MaxValue。考虑:varr=Int32.MaxValue/2;//r=1073741823varans=r*3;//ans=-1073741827这样做的原因是负整数在max位用1表示,所以任何大于max的乘法在位置都会有一个1,这被解释为负值。溢出是所有整数类型(int、short、byte、sbyte、char、long、ulong、ushort和uint)的危险。您可以使用浮点类型,例如float或double,但这会引入其他问题,例如舍入和相等问题。您必须知道您期望的数字类型,然后您可以使用其他类型,如long、uint、ulong或浮点类型,如double或decimal。最后,如果您不知道会发生什么,则需要在输入上编写保护代码(例如,将其包装在检查过的{}块中[谢谢,@EricLippert]),并在值超出范围时进行处理你设计的。编辑:.Net4.0+中的另一个选项是使用System.Numerics.BigInteger,它可以避免任何溢出,但速度可能很慢。一个快速而肮脏的解决方案是只将其中一个值转换为long,如果可能的话,然后将结果转换回int。编辑:在这种情况下不需要使用BigInteger,因为intxint永远不会溢出long。它可能是一个整数溢出异常。即使您将数字存储在足够大的变量中,也会发生这种情况。示例(long、double等)intone=int.MaxValue;inttwo=int.MaxValue;长和=(长)(一+二);//返回-2,因为转换是在总和之后//(long)-2。你可以在求和之前转换它们并得到正确的结果以上是C#学习教程:两个正的Int32相乘返回错误的负答案?分享的所有内容,如果对你有用,需要了解更多C#学习教程,希望大家多多关注——intone=int.MaxValue;inttwo=int.MaxValue;longsum=(long)one+(long)two;//返回4294967294,将//integer都转为long,然后相加本文来自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:

最新推荐
猜你喜欢