这是一串代码

#include<bits/stdc++.h>
typedef long long ll;
ll a[35],b[35];
int main(){
	a[0]=b[0]=1;
	for(int i=1;i<32;i++)a[i]=(1<<i);
	for(int i=1;i<32;i++)b[i]=b[i-1]<<1;
	return 0;
}

仿佛\(a,b\)两个数组是一样的,\(a_i=b_i=2^i\)

但是输出后:

for(int i=0;i<32;i++)printf("a[%02d] = %-12lld ,b[%02d] = %-12lld\n",i,a[i],i,b[i]);

1<<31怎么等于-2147483648了?——关于long long的一点小研究_c++

细看最后一行,我们发现,使用位运算时,1<<31为负数,这是为什么?

实际上,真实原因是,在C++中,1是一个int类型的数

我们只需要将代码改为:

#include<bits/stdc++.h>
typedef long long ll;
ll a[35],b[35];
int main(){
	a[0]=b[0]=1;
	for(int i=1;i<32;i++)a[i]=(a[0]<<i);
	for(int i=1;i<32;i++)b[i]=b[i-1]<<1;
	printf("\n");
	for(int i=0;i<32;i++)printf(" a[%02d] = %-12lld ,b[%02d] = %-12lld\n",i,a[i],i,b[i]);
	return 0;
}

那么一切就恢复正常了:
1<<31怎么等于-2147483648了?——关于long long的一点小研究_2d_02