为什么 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],这会导致两个操作数转换为相同类型,粗略地说是两者中较大的一个。