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

为什么在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.


慕容708150
浏览 707回答 3
3回答

江户川乱折腾

在C+中,只有当移动的值小于类型的大小时,才能很好地定义Shift。如果int是32位,那么只有0到,包括31个步骤是很好的定义.那这是为什么?如果您查看执行移位的底层硬件,如果它只需要查看值的下五位(在32位情况下),则可以使用较少的逻辑门来实现,而不是必须检查值的每一点。评论中对问题的回答C和C+被设计成在任何可用的硬件上尽可能快地运行。今天,生成的代码只是一个“Shift”指令,不管底层硬件如何处理指定范围之外的值。如果语言指定了Shift的行为方式,那么在执行Shift之前,生成的代码可能必须检查移位计数是否在范围内。通常,这会产生三个指令(比较、分支、移位)。(诚然,在这种情况下,这是不必要的,因为班次计数是已知的。)

胡子哥哥

根据C+标准,这是未定义的行为:E1<E2的值为E1左移E2位置;空出位为零填充位。如果E1具有无符号类型,则结果的值为E1×2^E2,减少的模比结果类型中可表示的最大值高。否则,如果E1具有符号类型和非负值,且E1×2^E2在结果类型中可表示,则为结果值;否则,行为是未定义的。.
打开App,查看更多内容
随时随地看视频慕课网APP