有如下代码,求OP
#define OP
/* Unknown operator */
int arith(int x) {
return x OP 4;
}
汇编:
movl %edi, -4(%rbp)
movl -4(%rbp), %eax
leal 3(%rax), %edx
testl %eax, %eax
cmovs %edx, %eax
sarl $2, %eax
答案应该是“/”,汇编的意思即
x = (x>=0)?x:x+3;
x = x>>2;
//正数直接除,负数加3再除
若x<0为何+3。
众所周知,“/“结果去掉所有小数。试想,若小数位非0个位就进1,这该如何实现呢?除以4前加3就不难理解。
众所周知,补码取反加1。对于负数来说0才是有意义的数,举个例子-3(0xffff fffd)有意义的就是后面那1101中的0
若在正数的世界中仅倒二位有意义的话,那就是2咯。实为3,故与实际相比差1,因为补码取反加1。
显然负数除前要加1,正数中的3实为负数中的1。