为了账号安全,请及时绑定邮箱和手机立即绑定

为什么在32次以上使用时,32位整数的左位移位(<“)不像预期的那样工作呢?

为什么在32次以上使用时,32位整数的左位移位(<“)不像预期的那样工作呢?

C++
慕容708150 2019-07-12 10:50:44
为什么在32次以上使用时,32位整数的左位移位(<“)不像预期的那样工作呢?当我编写以下程序并使用GNU C+编译器时,输出是1我认为这是由编译器执行的旋转操作造成的。#include <iostream>int main(){     int a = 1;     std::cout << (a << 32) << std::endl;     return 0;}但从逻辑上说,如果比特宽度溢出,则输出应该为0。怎么回事?密码在第一位,http://ideone.com/VPTwj.
查看完整描述

3 回答

?
江户川乱折腾

TA贡献1851条经验 获得超5个赞

在C+中,只有当移动的值小于类型的大小时,才能很好地定义Shift。如果int是32位,那么只有0到,包括31个步骤是很好的定义.

那这是为什么?

如果您查看执行移位的底层硬件,如果它只需要查看值的下五位(在32位情况下),则可以使用较少的逻辑门来实现,而不是必须检查值的每一点。

评论中对问题的回答

C和C+被设计成在任何可用的硬件上尽可能快地运行。今天,生成的代码只是一个“Shift”指令,不管底层硬件如何处理指定范围之外的值。如果语言指定了Shift的行为方式,那么在执行Shift之前,生成的代码可能必须检查移位计数是否在范围内。通常,这会产生三个指令(比较、分支、移位)。(诚然,在这种情况下,这是不必要的,因为班次计数是已知的。)


查看完整回答
反对 回复 2019-07-12
?
胡子哥哥

TA贡献1825条经验 获得超6个赞

根据C+标准,这是未定义的行为:

E1<E2的值为E1左移E2位置;空出位为零填充位。如果E1具有无符号类型,则结果的值为E1×2^E2,减少的模比结果类型中可表示的最大值高。否则,如果E1具有符号类型和非负值,且E1×2^E2在结果类型中可表示,则为结果值;否则,行为是未定义的。.


查看完整回答
反对 回复 2019-07-12
  • 3 回答
  • 0 关注
  • 706 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信