C++算术溢出(VS2019,C++17)

问题遇到的现象和发生背景

C++算术溢出(VS2019,C++17)

用代码块功能插入代码,请勿粘贴截图
#include 
using namespace std;

int main() {
    long long a = 4'294'967'296L;  // 正确
    cout << a << endl;
    long long b = 16777216L*4096L;  // 乘法结果得到0。这是为什么? 
    cout << b << endl;
    return 0;
}
运行结果及报错内容

4294967296
0

我的解答思路和尝试过的方法

试过把编译器改为x64,但问题依旧

16777216L*4096L;
2个数按long进行计算,结果赋值给long long。
而上面式子按long运算的结果是溢出为0的。
先把其中一个给long long,然后在计算就不会溢出了。
long long b = 16777216L;
b *= 4096L;

long 溢出了
long long b = 16777216LL*4096L;//这样就不会溢出了

VS编译器认为的long是32位数,long long是64位 ,而问题中的 long long b = 16777216L4096L; 其中b的结果是在编译生成程序之前就编译器会把结果计算出来,这不是程序执行才计算出来的,就是说代码写着是long long b = 16777216L4096L; 实际上编译完之后,b是一个确定的值保存在程序的代码段。编译时,会根据你算子中数据的格式去计算出算子的结果,16777216L*4096L ,中的L标志了这个数据类型为 long类型,编译从左到右按照long类型去计算,实际上这是编译器计算出错了,给你返回了一个无效值,并不是程序数据溢出。数字标志应该选用合理的标志, 如long t = 2134L ,long long t = 2345LL , float t = 0.234f .....

你在干什么呀,这两个数乘完是68'719'476'736,也不是4'294'967'296啊,你在搞什么呀