gpt4 book ai didi

c - 哪种有符号整数除法对应位移位?

转载 作者:行者123 更新时间:2023-12-04 02:33:11 25 4
gpt4 key购买 nike

众所周知,当将整数除以 2 的幂时,好的编译器会将其强度约简为位移位。

例如:

int main(int argc, char **argv) {
return argc/2;
}

Clang -O2 将其编译为:

movl    %ecx, %eax
shrl $31, %eax
addl %ecx, %eax
sarl %eax
retq

值得注意的是,虽然这个指令序列比实际的除法指令快得多,但它并不如人们希望的那样只是一个位移位。据推测,这是因为典型的 CPU 和 C 最终决定截断除法(商向零舍入),而这恰好与算术右移不完全匹配(并且需要强度降低以准确保留语义)。

哪种类型的有符号整数除法与算术右移完全匹配?

最佳答案

在执行算术右移的情况下,floor 乘以 2 的幂是最合适的运算,它匹配有符号整数右移(向 -inf< 舍入/em>).

请注意,有符号整数的右移是实现定义的。它可能是算术右移(由大多数知名编译器实现)或逻辑右移。更多关于这两个操作之间的区别可以找到 here .

算术右移示例:https://godbolt.org/z/zhhfbc

#include <stdio.h>
#include <math.h>

int main(void)
{
int val1 = 7;
int val2 = -7;

printf("Value1 = %.1lf\n", floor(val1/2.0));
printf("Value2 = %.1lf\n", floor(val2/2.0));

printf("Value1 = %d\n", val1 >> 1);
printf("Value2 = %d\n", val2 >> 1);

return 0;
}

输出是:

Value1 = 3.0

Value2 = -4.0

Value1 = 3

Value2 = -4

关于c - 哪种有符号整数除法对应位移位?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63018450/

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