为什么 1ll << i 确实给了我们正确的答案但不是 long long i ; 1<<我?
Why do 1ll << i does give us correct answer but not long long i ; 1<<i?
由于<<
运算符中的1个操作数是long long
类型,答案应存储为long long
,
我对这种行为感到有点惊讶 谁能解释为什么会这样?
例如:
#include<bits/stdc++.h>
using namespace std;
int main(){
long long p=33;
long long a = 1<<p;
cout<<a;
} //This gives the wrong output
int main(){
long long a = 1ll<<33;
cout<<a;
} //this gives right output
C++11 (N3690) 5.8 移位运算符 [expr.shift] p1:
The operands shall be of integral or unscoped enumeration type and integral promotions are performed.
The type of the result is that of the promoted left operand.
所以1 << i
的类型是int
,而1LL << i
的类型是long long
,通常可以表示更大范围的值。
这里的移位运算符很特别;大多数其他运算符遵循 通常的算术转换 [5 p10],这会导致两个操作数转换为相同类型,粗略地说是两者中较大的一个。
由于<<
运算符中的1个操作数是long long
类型,答案应存储为long long
,
我对这种行为感到有点惊讶 谁能解释为什么会这样?
例如:
#include<bits/stdc++.h>
using namespace std;
int main(){
long long p=33;
long long a = 1<<p;
cout<<a;
} //This gives the wrong output
int main(){
long long a = 1ll<<33;
cout<<a;
} //this gives right output
C++11 (N3690) 5.8 移位运算符 [expr.shift] p1:
The operands shall be of integral or unscoped enumeration type and integral promotions are performed. The type of the result is that of the promoted left operand.
所以1 << i
的类型是int
,而1LL << i
的类型是long long
,通常可以表示更大范围的值。
这里的移位运算符很特别;大多数其他运算符遵循 通常的算术转换 [5 p10],这会导致两个操作数转换为相同类型,粗略地说是两者中较大的一个。