C++ 除以2和Sigsegv错误时位移位的奇怪行为

C++ 除以2和Sigsegv错误时位移位的奇怪行为,c++,bit-manipulation,bitwise-operators,bit-shift,C++,Bit Manipulation,Bitwise Operators,Bit Shift,我在写一段代码,其中我必须执行2除法。下面的代码行给出了正确的输出 ans = ans + ((long long)cnt * (cnt-1))/2; 但是当我把它改成 ans = ans + ((long long)cnt * (cnt-1)) >> 1; 上面的代码有什么问题 在我的设置中,值从不为负值 这是密码 #include<bits/stdc++.h> #define _ ios_base::sync_with_stdio(0);cin.tie(0); u

我在写一段代码,其中我必须执行2除法。下面的代码行给出了正确的输出

ans = ans + ((long long)cnt * (cnt-1))/2;
但是当我把它改成

ans = ans + ((long long)cnt * (cnt-1)) >> 1;
上面的代码有什么问题

在我的设置中,值从不为负值

这是密码

#include<bits/stdc++.h>
#define _ ios_base::sync_with_stdio(0);cin.tie(0);
using namespace std;
int s[1000000];
int main(){_
int t;
cin>>t;
while(t--){
    int n,i,z,sum=0,p,cnt=0;
    unsigned long long int ans=0;
    cin>>n;
    for(i=0;i<n;i++){
        cin>>z;
        sum+=z;
        s[i]=sum;
    }
    sort(s,s+n);
    i=0;
    while(i<n){
        p=s[i];
        cnt=0;
        while(s[i]==p){
            cnt++;
            i++;
        }
        ans=ans+((unsigned long long)cnt*(cnt-1))>>1;
    }
    cnt=0;
    for(int i=0;i<n && s[i]<=0;i++){
        if(s[i]==0){
            cnt++;
        }
    }
    ans+=cnt;
    cout<<ans<<"\n";
}
return 0;
}
#包括
#定义ios_base::与_stdio同步(0);cin.tie(0);
使用名称空间std;
整数s[1000000];
int main(){_
int t;
cin>>t;
而(t--){
int n,i,z,和=0,p,cnt=0;
无符号长整型ans=0;
cin>>n;
对于(i=0;i>z;
总和+=z;
s[i]=总和;
}
排序(s,s+n);
i=0;
而(i>1;
}
cnt=0;

对于(int i=0;i运算符
>
的值大于
+
(当然还有
/
),因此您编写了以下等效项:

ans = ( ans + ((long long)cnt * (cnt-1)) ) >> 1;
//    ^--- note these -------------------^

对于sigsegv问题,我猜这是
I
索引在内环中的特定条件下运行超过
s[]
数组末尾的结果:

while(i<n){
       p=s[i];
       cnt=0;
       while(s[i]==p){
           cnt++;
           i++;         // <== I'm not convinced this will always remain less than n
                        //     or less than 1000000 depending on the data set and 
                        //     what happens to be in memory after `s[]`
       }
       ans=ans+((unsigned long long)cnt*(cnt-1))>>1;
}

while(注意左除法和右移位法对于负整数的行为不同。cnt的类型是int…。在我的设置中,值永远不会negative@user103260因此,请发布一个最小的、完整的、可复制的示例来说明问题。“错误”不提供信息。操作员优先级可能是这里的一个问题。@user103260:你问这个问题是出于好奇还是打算用
>1
替换
/2
。如果是后者-不要。没有必要这样做。是的,这是错误,谢谢…但是我还不能找出sigsegv错误的原因谢谢,k甚至观察!