一些代码将除法四舍五入来演示(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
不知情的情况下与之联系。问题是内核空间不同(例如 no 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 );
}
我知道如何解决这个问题: Override udivdi3()
and umoddi3()
with do_div()
from asm/div64.h。做对了吗?错误的。有符号与无符号不同,sdivdi3()
不只是调用udivdi3()
,它们是独立的函数是有原因的。
你解决了这个问题吗?你知道可以帮助我做到这一点的图书馆吗?我真的被困住了,所以无论你在这里看到什么,我现在还没有看到,都会很有帮助。
谢谢,乍得