为什么将int改成long long反而溢出呢

请问这道题目为什么使用int可以通过,改成long long反而不行
这是题目链接:https://www.nowcoder.com/practice/5928127cc6604129923346e955e75984?tpId=40&tqId=21376&rp=1&ru=/ta/kaoyan&qru=/ta/kaoyan&difficulty=&judgeStatus=3&tags=/question-ranking

#include
#include
#include
#include
#include
#include
#include

using namespace std;

int main(){
    string s;
    while(getline(cin,s)){
        int sum=0;
        for(int i=0;isize();i++){
            sum+=(s[i]-'0')*((2<<(s.size()-1-i))-1);
            //最低位为第0位,第k位数为x,则该位计算为x*(2^(k+1)-1)
            //最终的结果是要把读入的数的全部位进行上述计算后相加
        }
        cout<return 0;
}

这是我写的代码,溢出的输入是1000000000000000000000000000000,正确输出是:2147483647,但把sum改成long long后输出为:-2147483649
为什么ong long型反而溢出呢,这是为什么?麻烦了解的lao解答一下,谢谢!

改成long long只是sum而已,问题是2<<(s.size()-1-i) 这个值本身就会溢出了啊。改一下:

long long sum = 0;
for(int i=0;i<s.size();i++){
            long long n = 2;
            n = n<<s.size()-1-i;
            sum+=(s[i]-'0')*(n-1);
}