c++ - 移位运算符如何在c ++中处理负数
问题描述
int main()
{
int x = -2;
cout << (1<<x) << endl;
cout << (1<<-2) << endl;
}
这里(1<<x)
打印 1073741824 (这是如何计算的)
而(1<<-2)
打印一个垃圾值。
为什么这两个返回不同的答案?
解决方案
根据 C 标准(6.5.7 位移位运算符)
3 对每个操作数执行整数提升。结果的类型是提升的左操作数的类型。如果右操作数的值为负数或大于或等于提升的左操作数的宽度,则行为未定义
相同的写在 C++ 标准(C++20、7.6.7 移位运算符)
- ...操作数应为整数或非范围枚举类型,并执行整数提升。结果的类型是提升的左操作数的类型。如果右操作数为负数,或者大于或等于提升的左操作数的宽度,则行为未定义。
推荐阅读
- reactjs - 无法解析“/Users/johnnynolan/Repos/simple-component-library/src”中的“./lib”
- mysql - 亚马逊红移禁用完整分组
- swift - ReactiveCocoa 内存泄漏 - UIButton 的 CocoaAction 防止 MVVM 对象反初始化
- c++ - 模板内嵌套类型名称的流式运算符重载
- java - 编程端ActionBar中可绘制的后退箭头ID
- java - 如何在 JRuby 中加载已编译的 Java 类?
- java - 瞬态内存中的 Java Card 对象实例
- ruby-on-rails - Rails:对 Rack::Timeout::RequestTimeoutException 进行故障排除
- symfony - 如何使用 RabbitMQ 对 API 请求进行排队
- python - 使用 MNIST 数据格式进行机器学习分类?