C# C区有马尔迪夫吗?

C# C区有马尔迪夫吗?,c#,C#,有马尔迪夫吗 是C语言还是与之相当的语言 还是我应该实施它 编辑:没有PInvoking 否,这不是现成的。你需要这样做 当然,您可以自己实现它: //truncation is unnecessary if you want to continue using a long //the truncation can never overflow so it is unchecked var result = unchecked((int)(nNumber * (long)nNumerator

有马尔迪夫吗

是C语言还是与之相当的语言

还是我应该实施它


编辑:没有PInvoking

否,这不是现成的。你需要这样做

当然,您可以自己实现它:

//truncation is unnecessary if you want to continue using a long
//the truncation can never overflow so it is unchecked
var result = unchecked((int)(nNumber * (long)nNumerator / nDenominator));

不,这不是现成的。你需要这样做

当然,您可以自己实现它:

//truncation is unnecessary if you want to continue using a long
//the truncation can never overflow so it is unchecked
var result = unchecked((int)(nNumber * (long)nNumerator / nDenominator));

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

微软的一个巨大负担是,一旦他们发布了一个api函数,他们就必须永远维护它,除非它与操作系统中的必要更改严重不兼容。虽然MulDiv没有什么不好的地方,但是int参数确实自动提升到了32位,这使得该函数几乎完全没有必要。但是为Win3编写的程序仍然可以编译,backcompat是神圣的

这给api增加负担有点错误,但动机很强,很难将窗口系统塞进640 KB。公开已经存在的内容,因为操作系统需要它,这确实有助于减少字节。其他类似的api函数是wprintf、lstrcpyXxx等核心C运行时函数,现在仍然可用,甚至可以通过切换到Unicode进行维护。窗户的考古记录

Pinvok没有任何意义,C在这方面没有问题:

public static int MulDiv(int number, int numerator, int denominator) {
    return (int)(((long)number * numerator) / denominator);
}

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

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

微软的一个巨大负担是,一旦他们发布了一个api函数,他们就必须永远维护它,除非它与操作系统中的必要更改严重不兼容。虽然MulDiv没有什么不好的地方,但是int参数确实自动提升到了32位,这使得该函数几乎完全没有必要。但是为Win3编写的程序仍然可以编译,backcompat是神圣的

这给api增加负担有点错误,但动机很强,很难将窗口系统塞进640 KB。公开已经存在的内容,因为操作系统需要它,这确实有助于减少字节。其他类似的api函数是wprintf、lstrcpyXxx等核心C运行时函数,现在仍然可用,甚至可以通过切换到Unicode进行维护。窗户的考古记录

Pinvok没有任何意义,C在这方面没有问题:

public static int MulDiv(int number, int numerator, int denominator) {
    return (int)(((long)number * numerator) / denominator);
}

如果希望出现溢出异常,请使用checked关键字。

如果要明确指出,您正在尽力处理两个32位整数可能产生大于32位整数的值的情况,可以使用Math.BigMul,然后将结果除以并将其转换回整数。我明白了,正如其他答案所述,.NET对64位整数的支持显然提供了MulDiv以前所需要的所有好处,然后是一些好处

int result = unchecked((int)(System.Math.BigMul(nNumber, nNumerator) / nDenominator));

如果您想清楚地表明您正在尽力处理两个32位整数可能产生大于32位整数的值的情况,可以使用Math.BigMul,然后将结果除以并将其转换回整数。我明白了,正如其他答案所述,.NET对64位整数的支持显然提供了MulDiv以前所需要的所有好处,然后是一些好处

int result = unchecked((int)(System.Math.BigMul(nNumber, nNumerator) / nDenominator));

这是对Hans Passant sugestion的增强,但根据MSDN文件,包括+0.5四舍五入:

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

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

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

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

注意:这段代码使用右移运算符来获得最佳性能。

不,我不想PInvoke itI刚才问过,所以如果已经有一个实现,就不需要浪费时间实现一个!当然幸运的是,CLR支持64位整数,因此您可以在一行中全速完成。我认为这与MulDiv不一样。@Gabe,您能更具体一点吗?这是使用64位中间值。它有完全的精确性。不,我不想PInvoke,我只是问了一下,所以如果已经有了一个实现,就没有必要浪费时间实现一个!当然幸运的是,CLR支持64位整数,因此您可以在一行中全速完成。我认为这与MulDiv的情况不一样。@Gabe,您能再多做一点吗
具体的这是使用64位中间值。P/Invoke MulDiv的原因是为了获得相同的舍入和溢出行为。看看所有血淋淋的细节。好吧,幸好我提到了我猜的checked关键字:Catch and return-1,假设它真的有用。C api函数中的幻数也早已过时。你删除我的问题了吗?我觉得这是一个合理的问题,问你为什么觉得MulDiv是一个错误,尽管动机如此。如果你想问问题,请单击“提问”按钮。我的问题中没有足够的内容,也没有足够的相关性,因此无法问一个新问题。我的问题也不是基于事实。我在这里根据你的答案征求你的意见,这就是为什么这里是对你答案的评论。编辑:如果你要发脾气,删除我的评论,至少要删除你自己的评论,并修复你的MulDiv,使之真正有效。您滥用了删除权限。P/Invoke MulDiv的原因是为了获得相同的舍入和溢出行为。看看所有血淋淋的细节。好吧,幸好我提到了我猜的checked关键字:Catch and return-1,假设它真的有用。C api函数中的幻数也早已过时。你删除我的问题了吗?我觉得这是一个合理的问题,问你为什么觉得MulDiv是一个错误,尽管动机如此。如果你想问问题,请单击“提问”按钮。我的问题中没有足够的内容,也没有足够的相关性,因此无法问一个新问题。我的问题也不是基于事实。我在这里根据你的答案征求你的意见,这就是为什么这里是对你答案的评论。编辑:如果你要发脾气,删除我的评论,至少要删除你自己的评论,并修复你的MulDiv,使之真正有效。你滥用了删除权限。