C#中有MulDiv吗?

Aba*_*oub 1 c#

在那儿 MulDiv

WINBASEAPI
int
WINAPI
MulDiv(
    _In_ int nNumber,
    _In_ int nNumerator,
    _In_ int nDenominator
    );
Run Code Online (Sandbox Code Playgroud)

在C#或相当于它?

或者我应该实施它?

编辑:没有PInvoking !!

Han*_*ant 5

这个api函数可以追溯到Windows版本3,一个16位版本的Windows.很可能之前,我还不够大.如果让C编译器将两个16位数字(两个整数)相乘有点困难,那么得到一个32位中间结果并除以一个16位数来得到一个16位结果.操作很常见,例如计算字体大小.

微软的一大负担是,一旦他们发布了api功能,他们就必须永远维护它,除非它与操作系统中必要的更改完全不兼容.关于MulDiv()没什么大不了的,但int参数确实会自动提升到32位,这使得函数完全没必要.但是为Win3编写的程序仍在编译,backcompat是神圣的.

用这个来加重api是一个错误,但动机很强,很难把窗口系统塞进640千字节.暴露已经存在的东西,因为操作系统需要它真的有助于削减字节.其他类似的api函数是wprintf(),lstrcpyXxx()等.核心C运行时函数现在仍然可用,甚至可以通过切换到Unicode来维护.Windows的考古记录.

顺便说一句,C#没有问题:

public static int MulDiv(int number, int numerator, int denominator) {
    return (int)(((long)number * numerator) / denominator);
}
Run Code Online (Sandbox Code Playgroud)

如果需要溢出异常,请使用checked关键字.

  • 好吧,好东西我提到了*checked*关键字我想:)捕捉并返回-1,假设它真的很有用.C api函数中的幻数也很久已过时. (2认同)

mgr*_*er4 5

这是对Hans Passant消化的增强,但包括根据MSDN文档的+0.5舍入:

public static int MulDiv(int number, int numerator, int denominator)
{
    return (int)(((long)number * numerator + (denominator >> 1)) / denominator);
}
Run Code Online (Sandbox Code Playgroud)

注意:此代码使用右移运算符来获得最佳性能.