一个数左移32位会出现什么情况?

twozong 2011-04-12 04:08:26
int a=5;
a=a<<32;
printf("%x",a);


编译会报警告。
结果是5


为什么?
...全文
936 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
CppCoder 2011-04-12
  • 打赏
  • 举报
回复
依赖编译器的写法
操作结果未知
sky198306 2011-04-12
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 taodm 的回复:]
C、C++语言目前指出,左移大于等于机器字长位数时,结果不太确定的。不值得多耗激励讨论。
[/Quote]+
pengzhixi 2011-04-12
  • 打赏
  • 举报
回复
If the value of the right operand is negative or is
greater than or equal to the width of the promoted left operand, the behavior is undefined
taodm 2011-04-12
  • 打赏
  • 举报
回复
C、C++语言目前指出,左移大于等于机器字长位数时,结果不太确定的。不值得多耗激励讨论。
twozong 2011-04-12
  • 打赏
  • 举报
回复
我测试左移5左移33位打印,又变成了a。。。。
qinjuning 2011-04-12
  • 打赏
  • 举报
回复
数组越界了。每左移一位,即为乘以2,所以整数越界了。
luciferisnotsatan 2011-04-12
  • 打赏
  • 举报
回复
估计是cpu指令里的特性吧

a=a<<31;
a=a<<1;
这么移,最后就是0了

shl 32位,结果还是5

a=a<<32;
00412A55 mov eax,dword ptr [a]
00412A58 shl eax,20h
00412A5B mov dword ptr [a],eax

a=a<<31;
00412A55 mov eax,dword ptr [a]
00412A58 shl eax,1Fh
00412A5B mov dword ptr [a],eax
a=a<<1;
00412A5E mov eax,dword ptr [a]
00412A61 shl eax,1
00412A63 mov dword ptr [a],eax
tianya0609 2011-04-12
  • 打赏
  • 举报
回复
32位机器,32位就等于没移动嘛,绕一圈。不过有些机器对超过31位的可能不是这么处理,标准好像没规定
liao05050075 2011-04-12
  • 打赏
  • 举报
回复
这个表达式本身就是不合法的。它会出现什么结果也是未定义的。
看《C陷阱与缺陷》 7.5移位运算符,p110: n<<32 或 n<<-1是非法的
bdmh 2011-04-12
  • 打赏
  • 举报
回复
左移32位,已经超出了int的长度,已经移出i了

69,373

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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