当前位置:  开发笔记 > 编程语言 > 正文

如何在Linux内核中划分两个64位数字?

如何解决《如何在Linux内核中划分两个64位数字?》经验,为你挑选了0个好方法。

一些代码围绕分区演示(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(),它们是单独的函数是有原因的.

你解决了这个问题吗?你知道有一个图书馆可以帮我这么做吗?我真的被困住了,所以无论你在这里看到什么,我现在都不会对你有所帮助.

谢谢,乍得

推荐阅读
雯颜哥_135
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有