一些代码围绕分区演示(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).该怎么办?
抓取谷歌一段时间,注意几乎每个人都解决无符号变体:
#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().做对了吗?错误.签名与unsigned不同,sdivdi3()_不是简单地调用udivdi3(),它们是单独的函数是有原因的.
你解决了这个问题吗?你知道有一个图书馆可以帮我这么做吗?我真的被困住了,所以无论你在这里看到什么,我现在都不会对你有所帮助.
谢谢,乍得