“Math.DivRem”和%运算符之间的区别?

时间:2011-08-08 20:52:46

标签: .net math operators division

System.Math.DivRem()%运算符之间有什么区别?

3 个答案:

答案 0 :(得分:26)

%为您提供除法的余数并完全丢弃商,而DivRem()计算并返回 商和余数。

如果您只关心两个整数之间的余数,请使用%

int remainder = 10 % 3;
Console.WriteLine(remainder); // 1

如果您需要知道在余数为1之前10被除以3的次数,请使用DivRem(),它返回商并将余数存储在out参数中:

int quotient, remainder;
quotient = Math.DivRem(10, 3, out remainder);
Console.WriteLine(quotient);  // 3
Console.WriteLine(remainder); // 1

答案 1 :(得分:8)

这是一项优化。某些处理器能够同时计算这两个值。其他处理器不能分为硬件(并且必须使用非常慢的软件例程)。

在任何一种情况下(除非你有一个智能编译器),你最终可能会计算两次相同的分区。由于在任何处理器上(即使在硬件中实现),分区永远不会很快,因此使用Math.DivRem可以为JIT提供一个很好的“提示”来仅计算一次值。

iirc Mono没有实现这种优化,我甚至不确定MS是否这样做。

答案 2 :(得分:5)

可以进行优化,但不幸的是,它产生的IL与分区 PLUS 的mod操作相同。

在典型的体系结构(x86和朋友)上,这两者可以从单个操作中获得,但.NET JIT似乎没有优化(在我的测试中)。

所以以下两个是等价的:

quotient = Math.DivRem(10, 3, out remainder);

VS

quotient  = 10 / 3;
remainder = 10 % 3;

除了后者更具可读性。

对于记录,这个丑陋的选项在x86& 64:

quotient  = 10 / 3;
remainder = 10 - (3*quotient);

希望JIT有一天能够将两个操作优化为一个,因为它很简单。