c++ - 由于转换,C++ bitshift 换行?
问题描述
有人可以解释这种行为吗?
#include <iostream>
using namespace std;
int main(){
for(int i = 0; i <= 32; i++){
unsigned long test = 1u << i;
cout << test << endl;
}
}
输出:
1
2
4
8
16
32
64
128
256
512
1024
2048
4096
8192
16384
32768
65536
131072
262144
524288
1048576
2097152
4194304
8388608
16777216
33554432
67108864
134217728
268435456
536870912
1073741824
2147483648
1
直到最后才有意义。位移运算符不应该换行,但在这里它似乎正是这样做的。我想这是因为文字 '1u' 是比 unsigned long 更小的类型。使用 '1ul' 反而会使行为完全正常,所以类型转换肯定有问题,但我很想知道究竟是什么以及为什么!
解决方案
如果按位移位的右操作数的值为负数或大于或等于提升的左操作数中的位数,则行为未定义。
来自https://timsong-cpp.github.io/cppwp/n3337/expr.shift#1:
如果右操作数为负数,或者大于或等于提升的左操作数的位长度,则行为未定义。
解释未定义行为的行为是没有意义的,因为它是未定义的。
推荐阅读
- .htaccess - 使用 .htaccess 将 http 重定向到带有 www 的 https
- angular - 使用打字稿的角度适配器模式用于反应形式
- javascript - 添加具有 TS 属性 Angular 7 的 css 类名
- rust - 临时价值的寿命不够长
- java - 在第二类中使用一个类中定义的值
- javascript - 如何让这个类在每次点击时添加
- html - 高度:填充整个视口,但必要时滚动
- java - HttpServletResponse 到 javax.ws.rs.core.Response
- python-3.x - 如何在 Python 中构建一个 tkinter ttk 文本框
- python - 使用 TensorFlow 的一个奇怪的铸造问题