为什么1ll << i计算正确,long long变量接收1<<i的结果却出错?
C++左移运算符结果异常成因解释
这一问题本质是C/C++的表达式运算规则导致的,核心逻辑如下:
- 赋值运算符的执行顺序是先计算右侧表达式的值,再将结果转换为左侧变量的类型赋值,左侧变量的类型不会影响右侧表达式本身的运算规则
- 左移运算符
<<的运算精度由参与运算的操作数类型决定:- 第一个错误示例中,
1是默认的32位有符号int类型,1 << p整个运算全程按32位int规则执行,32位有符号int左移33位属于未定义行为,最终得到错误结果后再转换为long long也无法修正
错误示例代码:
#include<bits/stdc++.h> using namespace std; int main(){ long long p=33; long long a = 1<<p; cout<<a; }- 第二个正确示例中,
1ll显式声明为64位有符号long long类型,左移运算全程按64位规则执行,结果符合预期
正确示例代码:
#include<bits/stdc++.h> using namespace std; int main(){ long long a = 1ll<<33; cout<<a; } - 第一个错误示例中,
内容的提问来源于stack exchange,提问作者Vivek
相关产品推荐
相关产品推荐

