【发布时间】:2010-09-07 07:41:09
【问题描述】:
一些代码将除法四舍五入进行演示(C 语法):
#define SINT64 long long int
#define SINT32 long int
SINT64 divRound(SINT64 dividend, SINT64 divisor)
{
SINT32 quotient1 = dividend / divisor;
SINT32 modResult = dividend % divisor;
SINT32 multResult = modResult * 2;
SINT32 quotient2 = multResult / divisor;
SINT64 result = quotient1 + quotient2;
return ( result );
}
现在,如果这是用户空间,我们可能甚至不会注意到我们的编译器正在为这些运算符生成代码(例如,divdi3() 用于除法)。我们可能会在不知情的情况下与libgcc 链接。问题是内核空间不同(例如没有libgcc)。怎么办?
在 Google 上爬了一会儿,注意到几乎每个人都提到了未签名的变体:
#define UINT64 long long int
#define UINT32 long int
UINT64 divRound(UINT64 dividend, UINT64 divisor)
{
UINT32 quotient1 = dividend / divisor;
UINT32 modResult = dividend % divisor;
UINT32 multResult = modResult * 2;
UINT32 quotient2 = multResult / divisor;
UINT64 result = quotient1 + quotient2;
return ( result );
}
我知道如何解决这个问题:用 asm/div64.h 中的 do_div() 覆盖 udivdi3() 和 umoddi3()。做对了吗?错误的。有符号与无符号不同,sdivdi3() 不只是简单地调用udivdi3(),它们是独立的函数是有原因的。
你解决了这个问题吗?你知道可以帮助我做到这一点的图书馆吗?我真的被困住了,所以无论你在这里看到什么我现在没有看到的都会很有帮助。
谢谢, 乍得
【问题讨论】: