c++的移位操作"<<"和">>"

35 阅读2分钟

1. 问题背景

运行c++程序(mac操作系统)时,遇到1<<33=2的情况,按照常理,结果应该是0。因此该文档的初衷就是搞清楚背后的真相。

2. 问题分析

  1. 抛开编程语言不讲,第一步需要知道移位操作的运算过程。移位操作的方向包括左移和右移,类型包括逻辑移位,算术移位两种。其中额外注意的是算术右移(在左端补最高有效位的值,也就是保存符号位)。关于移位的详细运算过程,网上资料比较多,本文就不再赘述。
  2. 查询具体编程语言的移位实现。c++20标准关于移位的描述如下 截屏2024-04-24 23.38.10.png 根据这三句话可得出对应的三条信息:
    1. c++的左移不区分无符号数和有符号数,按照逻辑左移处理
    2. c++的无符号数是逻辑右移,有符号数是算术右移
    3. 移动位数是负数或者超过被移动数的位数时,属于未定义的行为

综上,显然1<<33的情况是违反了规则(超过被移动数的位数),属于未定义的行为

3. 问题总结

  1. 执行移位操作时,时刻铭记c++的相关标准,注意被移动数的位数(32位还是64位)。
  2. 解决问题过程中学习了移位操作的运算过程,其中逻辑移位比较容易理解,直接补0就可以,但是关于算术移位,小编就有很多疑问,比如为什么算术右移保留符号位,而算术左移没有保留 ?为什么算术右移是在左端补最高有效位的值 ?查过资料,也没找到答案。如果有同学知道的话,欢迎留言,万分感谢。

4. 参考

  1. 《深入理解计算机系统》
  2. en.cppreference.com/w/cpp/langu…