算术左移的问题。

CLANNADZY 2017-10-24 09:48:10
   
int a = 0x1, b = 32;
a = a << b;
printf("%d\n", a);

这段代码输出为1。
为什么呢?
小弟看了下汇编,代码如下:
        
61 [1] {
0x401691 55 push ebp
0x401692 <+0x0001> 89 e5 mov ebp,esp
0x401694 <+0x0003> 83 e4 f0 and esp,0xfffffff0
0x401697 <+0x0006> 83 ec 20 sub esp,0x20
0x40169a <+0x0009> e8 21 0e 00 00 call 0x4024c0 <__main>
62 [1] int a = 0x1, b = 32;
0x40169f <+0x000e> c7 44 24 1c 01 00 00 00 mov DWORD PTR [esp+0x1c],0x1
0x4016a7 <+0x0016> c7 44 24 18 20 00 00 00 mov DWORD PTR [esp+0x18],0x20
63 [1] a = a << b;
0x4016af <+0x001e> 8b 44 24 18 mov eax,DWORD PTR [esp+0x18]
0x4016b3 <+0x0022> 89 c1 mov ecx,eax
0x4016b5 <+0x0024> d3 64 24 1c shl DWORD PTR [esp+0x1c],cl
64 [1] printf("%d\n", a);
0x4016b9 <+0x0028> 8b 44 24 1c mov eax,DWORD PTR [esp+0x1c]
0x4016bd <+0x002c> 89 44 24 04 mov DWORD PTR [esp+0x4],eax
0x4016c1 <+0x0030> c7 04 24 65 a0 40 00 mov DWORD PTR [esp],0x40a065
0x4016c8 <+0x0037> e8 63 ff ff ff call 0x401630 <printf(char const*, ...)>
193 [1] }
0x4016cd <+0x003c> b8 00 00 00 00 mov eax,0x0
0x4016d2 <+0x0041> c9 leave
0x4016d3 <+0x0042> c3 ret


我发现第十四行,汇编代码是算术左移,那么bit 0 的1被移入CF中, [esp+0x1c]中存放的应该是0。但实际上a依然是1,为什么呢?
...全文
672 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
CLANNADZY 2017-10-27
  • 打赏
  • 举报
回复
引用 5 楼 of123 的回复:
将所有移动位数超过 31 的,都分成多次来完成就可以了。
支持你。3Q
of123 2017-10-26
  • 打赏
  • 举报
回复
将所有移动位数超过 31 的,都分成多次来完成就可以了。
worldy 2017-10-25
  • 打赏
  • 举报
回复
说明是循环左移
CLANNADZY 2017-10-25
  • 打赏
  • 举报
回复
引用 1 楼 of123 的回复:
分成两次左移 16 位试试。
谢谢,我试了

int a = 0x1,b=16;
   a = a<<b;
   printf("%d\n",a);
   a = a<<b;
   printf("%d\n",a);
输出 65536 和 0。 65536没错,说明1被移动到了bit 16 上。
of123 2017-10-25
  • 打赏
  • 举报
回复
分成两次左移 16 位试试。
of123 2017-10-25
  • 打赏
  • 举报
回复
还有一种可能是没有移动。有些芯片仅支持移位 1 - 31,会将 bit 5 以上屏蔽掉。循环左移的助记符是 ROL。

21,600

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 驱动开发/核心开发
社区管理员
  • 驱动开发/核心开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧