【发布时间】:2023-03-25 21:53:01
【问题描述】:
unsigned int a=200;
//mov dword ptr [a],0C8h
a >>= 1;
//mov eax,dword ptr [a]
//shr eax,1
//mov dword ptr [a],eax
a /= 2;
//mov eax,dword ptr [a]
//shr eax,1
//mov dword ptr [a],eax
int b = -200;
//mov dword ptr [b],0FFFFFF38h
b /= 2;
//mov eax,dword ptr [b]
//cdq
//sub eax,edx
//sar eax,1
//mov dword ptr [b],eax
b >>= 1;
//mov eax,dword ptr [b]
//sar eax,1
//mov dword ptr [b],eax
im using msvc, // 是该 C 语句的程序集。
为什么 signed int /=2 与 >>=1 不同? cdq 和 sub 在做什么?有必要吗?
【问题讨论】:
-
C 表示它们对负数的舍入方式不同(朝向 0 与朝向 -Inf); asm 必须反映这一点。
-
因为
-7 / 2 = -3而>> 1你会得到-4 -
大家,非常感谢。我明白他们为什么不同-。
-
算术右移与逻辑右移。一些 ISA 有一个真实或伪 ASR 指令来处理这个,有些没有,你必须合成它。
-
stackoverflow.com/questions/7622/… 实现定义(我没有检查当前规范)关于 C 编译器是算术还是逻辑编译器,因此某些编译器和/或某些命令行选项上的相同代码可能会产生分而治之的结果相同。实现定义。
标签: c assembly x86 integer-division