【发布时间】:2022-01-04 05:41:54
【问题描述】:
{
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= 类型宽度。
程序的输出是:
2^48=1000000000000
Shifted 1<<48=0
发生了什么事?为什么我不能将 64 位的数量移动 48 位?
【问题讨论】:
-
一个表达式获取该表达式使用的操作数的类型,不是在不同的(子)表达式中使用的某种类型。
1是int类型,所以这就是执行班次的原因。将这种有符号整数左移超过 31 位是未定义的行为。 切勿在 C 程序中键入1<< ...!它永远是不正确的。它应该始终是1U、1UL等或转换为无符号类型的东西。
标签: c integer-overflow gcc-warning