为什么 GCC long long int 不能执行 1<<48 但得到溢出警告
Why GCC long long int can't do 1<<48 but gets an overflow warning
{
unsigned long long two16, two48 ;
two16 = 65536;
two48 = two16 * two16 * two16 ;
printf("2^48=%llX \n",two48 );
two48 = 1<<48 ;
printf("Shifted 1<<48=%llX \n",two48);
return 0 ;
}
在 64 位机器上编译时,字长为 8,上面给出警告,two=1<<48 会溢出
左移计数 >= 类型宽度。
程序的输出是:
2^48=1000000000000
Shifted 1<<48=0
这是怎么回事?为什么我不能将 64 位数字移动 48 位?
why can I not shift a 64bit quantity 48 bits?
您不是将 64 位整数移动 48。您正在将 32 位整数 (1
) 移动 48,并将(溢出) 结果为 64 位整数。试试这个:
two48 = 1ULL << 48;
或者这个:
two48 = 1;
two48 = two48 << 48;
{
unsigned long long two16, two48 ;
two16 = 65536;
two48 = two16 * two16 * two16 ;
printf("2^48=%llX \n",two48 );
two48 = 1<<48 ;
printf("Shifted 1<<48=%llX \n",two48);
return 0 ;
}
在 64 位机器上编译时,字长为 8,上面给出警告,two=1<<48 会溢出 左移计数 >= 类型宽度。
程序的输出是:
2^48=1000000000000
Shifted 1<<48=0
这是怎么回事?为什么我不能将 64 位数字移动 48 位?
why can I not shift a 64bit quantity 48 bits?
您不是将 64 位整数移动 48。您正在将 32 位整数 (1
) 移动 48,并将(溢出) 结果为 64 位整数。试试这个:
two48 = 1ULL << 48;
或者这个:
two48 = 1;
two48 = two48 << 48;