【问题标题】:Is it possible to get the unsigned integer quotient and remained at once in C?是否有可能获得无符号整数商并立即保留在 C 中?
【发布时间】:2022-01-07 11:12:35
【问题描述】:

我知道 this question 关于在 C 中的单个操作中获取商和余数。但是 C 中的 divldiv 函数采用 intlong 参数。但是如何执行 unsigned 除法并将余数和商保存在 C 中?据我所知,没有unsigned 版本的divldiv。我必须使用内联汇编吗?

【问题讨论】:

  • 我相信 GCC 提供了一个优化标志,它会自动将使用 divmod 的上下文编译成单个指令调用。
  • 我认为您不应该尝试找到一种方法来优化此级别的代码。如果您以quotient = a / b; remainder = a % b; 之类的明显方式编写操作并在编译器中启用优化,您可以假设编译器将为您的目标处理器生成最佳代码。如果你真的发现你的编译器优化不够,你可能会使用汇编代码。

标签: c performance division micro-optimization unsigned-integer


【解决方案1】:

只需使用彼此足够接近的%/,并让任何合理的现代优化编译器将它们转换为一条指令。

示例:https://gcc.godbolt.org/z/TxeesqTqf

struct res { 
    unsigned long long quo;
    unsigned long long rem;
} 
f(unsigned long long x, unsigned long long y) {
    struct res r;
    r.quo = x / y;
    r.rem = x % y;
    return r;
}

由 GCC 11.2 -O2 编译到:

f:
        mov     rax, rdi
        xor     edx, edx
        div     rsi
        ret

【讨论】:

  • 过去几年情况可能发生了变化,但根据我的经验,这种方法在过去十年中并没有持续奏效。 “不合理”的编译器仍然存在,作为在 Compiler Explorer shows 上快速切换到 Clang for ARM7。我看到对__eabi_uldivmod 的调用,但只使用商,然后通过反乘计算模数。
猜你喜欢
  • 1970-01-01
  • 2020-09-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-27
  • 1970-01-01
  • 2011-12-07
相关资源
最近更新 更多