1. 问题背景
运行c++程序(mac操作系统)时,遇到1<<33=2的情况,按照常理,结果应该是0。因此该文档的初衷就是搞清楚背后的真相。
2. 问题分析
- 抛开编程语言不讲,第一步需要知道移位操作的运算过程。移位操作的方向包括左移和右移,类型包括逻辑移位,算术移位两种。其中额外注意的是算术右移(在左端补最高有效位的值,也就是保存符号位)。关于移位的详细运算过程,网上资料比较多,本文就不再赘述。
- 查询具体编程语言的移位实现。c++20标准关于移位的描述如下
根据这三句话可得出对应的三条信息:
- c++的左移不区分无符号数和有符号数,按照逻辑左移处理
- c++的无符号数是逻辑右移,有符号数是算术右移
- 移动位数是负数或者超过被移动数的位数时,属于未定义的行为
综上,显然1<<33的情况是违反了规则(超过被移动数的位数),属于未定义的行为。
3. 问题总结
- 执行移位操作时,时刻铭记c++的相关标准,注意被移动数的位数(32位还是64位)。
- 解决问题过程中学习了移位操作的运算过程,其中逻辑移位比较容易理解,直接补0就可以,但是关于算术移位,小编就有很多疑问,比如为什么算术右移保留符号位,而算术左移没有保留 ?为什么算术右移是在左端补最高有效位的值 ?查过资料,也没找到答案。如果有同学知道的话,欢迎留言,万分感谢。
4. 参考
- 《深入理解计算机系统》
- en.cppreference.com/w/cpp/langu…