整数除法

有如下代码,求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。