在那儿 MulDiv
WINBASEAPI
int
WINAPI
MulDiv(
_In_ int nNumber,
_In_ int nNumerator,
_In_ int nDenominator
);
Run Code Online (Sandbox Code Playgroud)
在C#或相当于它?
或者我应该实施它?
编辑:没有PInvoking !!
这个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关键字.
这是对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)
注意:此代码使用右移运算符来获得最佳性能.
| 归档时间: |
|
| 查看次数: |
2423 次 |
| 最近记录: |