除算を切り上げて示すコード (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。できましたか?違う。Signed は unsigned と同じではsdivdi3()
なく、単純に を呼び出すudivdi3()
のではなく、理由により別の関数です。
この問題は解決しましたか?これを行うのに役立つライブラリを知っていますか? 私は本当に立ち往生しているので、ここに表示されているものは何でも、私が今は本当に役に立たないでしょう.
ありがとう、チャド