You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为什么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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 22:27:03