gpt4 book ai didi

c - Linux内核上的64位划分

转载 作者:行者123 更新时间:2023-11-30 18:46:22 36 4
gpt4 key购买 nike

我正在寻找 64 位除法算法,但不依赖于 GPL 许可证。

我在Hacker Delight一书中找到了以下代码(图9-5):

unsigned long long udivdi3(unsigned long long u,
unsigned long long v)
if (v >> 32 == 0) {
if (u >> 32 < v)
return DIVU(u, v) & 0xFFFFFFFF;
else {
.....
}
}

问题是“return DIVU”计算 64/32 的除法,所以这不是我想要的。该怎么办?

最佳答案

在 Linux 内核代码中进行 64 位除法似乎很棘手。我不确定您是否遇到与我相同的问题,但这就是我所知道的。

看起来指令集不能完全处理 64 位算术。看起来 gcc 发出了对辅助函数的调用。例如,在 ARM 上,如果我写

t /= 86400;

其中 t 是 64 位变量,我的内核构建失败,并显示“对 '__aeabi_ldivmod' 的 undefined reference ”。显然,内核没有链接到存在诸如 __aeabi_ldivmod 等函数的完整 C 库。

解决方案似乎是调用 do_div 来代替。 do_div 实际上并不是一个函数;而是一个函数。它是在特定于体系结构的头文件中声明的宏。 (对于 ARM,它位于 arch/arm/include/asm/div64.h 中。x86 也有一个类似的文件。)

解决方案是将t/= 86400替换为

(void)do_div(t, 86400);

do_div 将其第一个参数除以第二个参数,然后返回余数(在本例中我忽略了它)。

div64.h 中有一个大注释,告诉您有关 do_div 以及如何使用它的更多信息。

关于c - Linux内核上的64位划分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52027696/

36 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com