我正在尝试为左移负数时未定义的行为生成警告。根据这个答案,C中负数的左移是未定义的。
E1 << E2 的结果是 E1 左移 E2 位位置;空出的位用零填充。如果 E1 具有无符号类型,则结果的值为 E1×2E2,比结果类型中可表示的最大值多模一减少。如果 E1 有带符号类型和非负值,并且 E1×2E2 在结果类型中是可表示的,那么这就是结果值;否则,行为未定义。
我试图了解为什么我没有收到此代码的警告:
x << 3
gcc -Wall(版本 9.1.0)
int main ()
{
int x= -4, y, z=5;
y = z << x;
y = x << 3;
return y;
}
另外,我也没有收到关于左移负数的警告
z << x