shl shr逻辑移位 空出来的位置全部补0
sar sal算术移位 sal与shl等价 sar填补和符号位相同 ==》所以只要赋值后移位操作结果应该是可以算出来的
printf("%x ", 2 >> 32);
push 0
push offset string "%d " (00420020)
call printf (00401080)
add esp, 8
先是压入两个参数 就是两个push 语句 参数的压入顺序从右往左边压入 然后调用printf函数 红色标记为对应的地址
因为2 >> 32 这条语句在编译的时候就可以得出结果(都是常量) 结果也是没有问题的 为0 最后执行的打印 输出也是0
printf("%d ", a >> 32);
mov eax, dword ptr [ebp-4] ;从运行栈中取出临时变量a 送往eax (eax) = 2
sar eax, 20h ;这里执行移位操作 如果按照一般的不走这里 (eax)= 0
push eax
push offset string "%d" (0042001c)
call printf (00401080)
add esp, 8;从栈顶出栈 弹出两个参数 保证调用前后的一致
执行移位后的eax值:
可以看到依然是2
大家可以测试下下面的代码 看看是不是一样 环境VC++6.0:
printf("%d ", 2>>1);
push 1
push offset string "%d " (00420020)
call printf (00401080)
add esp, 8
for (i=32; i>=1; --i)
mov dword ptr [ebp-8], 20h
jmp main+56h(0040b7c6)
mov eax, dword ptr[ebp-8]
sub eax, 1
mov dword ptr [ebp-8], eax
cmp dword ptr [ebp-8], 1
jl main+5eh(0040b7ce)
{
(a<<4);
}
jmp main+4dh (0040b7bd)
printf("%d ", a);
mov ecx, dword ptr[ebp-4]
push ecx
push offset string "%d " (00420020)
call printf (00401080)
add esp, 8
从上面的汇编结果可以看到
{
(a<<4);
}这里根本没有执行 我试着把4换成1 2 100 这些数字 也是一样的 不会有汇编代码产生 所以最后输出的结果(a)是不变的
最后试着把代码改成这样子:
a = (a<<4);
mov ecx, dwrod ptr[ebp-4]
sar ecx, 4
mov dword ptr[ebp-4], ecx
这会就有了 结果在
一定的范围之内是正确的
那么就看下 下面错误:

程序代码:
#include <stdio.h>
void main()
{
int a=2;
printf("%d ",2>>32);
printf("%d ",a>>32);
a = (a>>32);
printf("%d ", a);
}
// printf("%d ", 2>>1);
/* for (i=32; i>=1; --i)
{
a = (a>>3);
}
printf("%d ", a);*/
输出结果:
呵呵。。。 最后的a依然是2 现在看到32就有点怪
最后测试过很多组数据 现象是 移位的实际位数 是 n%32 单纯的跑汇编也是一样
希望能有个人帮忙解释下