【发布时间】:2020-07-21 16:01:37
【问题描述】:
众所周知的事实是,当整数除以 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 最终都解决了截断除法(商轮趋向于零),而这恰好与算术右移不完全匹配(并且需要降低强度以准确保留语义)。
哪种有符号整数除法会完全匹配算术右移?
【问题讨论】:
标签: c bit-manipulation bit-shift integer-division