Visual Studio 调试器在 C# 中的乘法问题

3
如果我在C#调试器的观察窗口中输入174 * 256 * 256 * 256,则结果为-1375731712。我猜想这与256有关,但我需要一些指导。
感谢!

这是因为整数溢出。 - BoltClock
我猜这可能与整数溢出有关。不要引用我的话,但是观察窗口的默认整数类型可能是32位。由于这个限制,乘法超过了最大值,最终溢出为负数。 - invalidsyntax
1
@invalidsyntax:这不是窗口的默认设置,而是语言的默认设置。在C#中,未装饰的整数字面值被解释为Int32。 - Eric Mickelsen
@Eric Mickelsen -- 感谢您的澄清。 - invalidsyntax
所以你们的意思是这是整数溢出? :-) - Mike Cole
6个回答

4

不,这与256无关。只是由于该乘法的结果大于最大可能的有符号32位整数,因此发生了溢出。

请尝试以下方法:

174L * 256L * 256L * 256L

这些是64位整数字面量。


有趣。为什么没有抛出异常? - Mike Cole
@Mike C.:整数乘法是处理器级别的指令,非常快速。检查溢出对于这种低级操作来说代价过高。具有任意大小或任意精度的数学需要没有固定大小的数据类型,通常称为“大型”。 - Eric Mickelsen
5
如果你想在C#程序中让整数算术在溢出时抛出异常,则可以采取以下方法:(1) "x = checked(ab);",(2) "checked { x = ab; }",或者(3) 编译器上有一个“将checked设为默认”开关。同样地,也有一个"unchecked"来强制使用相反的行为。 - Eric Lippert

1

它执行了一个unchecked溢出(所以是没有错误的溢出)。想象一下:Int32.MaxValue + 1 == Int32.MinValue,但是用乘法。

这解释了在内存中如何表示int http://en.wikipedia.org/wiki/Two's_complement


0

这是一个简单的溢出。尝试在您的监视窗口中输入以下内容:

(uint)(174 * 256 * 256 * 256)

0

尝试输入这个:

174 * 256 * 256 * 256f

所以结果不会被转换为整数,而是作为浮点数。


0

您面临整数溢出的问题。如果您想使用大数字而不受限制(除了可用内存外),则可以使用 System.Numerics.BigInteger。在您的特殊情况下,long(64 位整数)也可以胜任。


0

您的整数溢出了。真正的答案是2,919,235,584,但只有2,147,483,647可以表示为有符号整数。考虑使用无符号整数(uint)、长整型(long)、无符号长整型(ulong),或者如果这些还不够大的话。对于监视窗口,您可能需要将第一个参数强制转换或使用后缀,例如174L * 256L * 256L * 256L。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接