64,685
社区成员
发帖
与我相关
我的任务
分享
//vc 2010能得到正确的答案
int foo(int a)
{
00C71260 push ebp
00C71261 mov ebp,esp
00C71263 sub esp,44h
00C71266 push ebx
00C71267 push esi
00C71268 push edi
int d = (char(*)[3])a-(char(*)[3])0;
00C71269 mov eax,dword ptr [a]
00C7126C cdq
00C7126D mov ecx,3
00C71272 idiv eax,ecx //这就是除法
00C71274 mov dword ptr [d],eax
return d;
00C71277 mov eax,dword ptr [d]
}
//g++用了乘法,结果不正确
[code=c]
(gdb) set disassembly-flavor intel
(gdb) disassemble /m foo
Dump of assembler code for function foo(int):
3 {
0x080483dc <+0>: push ebp
0x080483dd <+1>: mov ebp,esp
0x080483df <+3>: sub esp,0x10
4 int d = ((char(*)[3])a - (char(*)[3])0);
0x080483e2 <+6>: mov eax,DWORD PTR [ebp+0x8]
0x080483e5 <+9>: imul eax,eax,0xaaaaaaab //这里用了乘法,还没有问什么乘以0xaaaaaaab
0x080483eb <+15>: mov DWORD PTR [ebp-0x4],eax
5 return d;
0x080483ee <+18>: mov eax,DWORD PTR [ebp-0x4]
6 }
0x080483f1 <+21>: leave
0x080483f2 <+22>: ret
[/code]
int divBy3(int a)
{
int neg=a<0?-1:1;
int ret=0;
a=a<0?-a:a;
while(a!=0)
{
a=a>>1;
ret+=a;
a=a>>1;
ret-=a;
}
return neg>1?ret:-ret;