在linux 内核中 arm 架构 进行 64位除法 必须使用do_div, 否则会出现如下错误
Unknown symbol __aeabi_ldivmod (err 0)
当然对于编译如下形式的程序,不会出现错误:
long long a = 0x888ffffffff;
int b = 0x10;
a = a / b;
printk("a = %lld", a);
原因是编译器在编译阶段 就可以算出a的值来, 因此不会将 64位的除法 等到 程序在 arm 中运行才去计算。但是,如果是这样就会出错:
do_sth(int b)
{
long long a = 0x888ffffffff
a = a / b;
printk("a = %lld", a); //注意,a必须要使用(作为lvalue)才能看到错误,否则编译器会直接忽略a
}
注意,上述情况仅仅会发生在内核编程中(驱动),对于应用层编程, 可以随便用long long型的除法,上述问题同样出现在double等类型的除法运算中。
如果在驱动编程中要进行64位除法操作,需按照下面方法:
使用asm/div64.h中宏do_div
#include
unsigned long long x, result;
unsigned long y, mod;
mod = do_div(x,y);
result = x;
64 bit division 结果保存在x中;余数保存在返回结果中;被除数不能也是64位的。