【发布时间】:2019-06-29 17:31:35
【问题描述】:
我正在尝试为左移负数时未定义的行为生成警告。根据this的回答,C中负数的左移是未定义的。
E1
我试图了解为什么我没有收到此代码的警告:
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
【问题讨论】:
-
为什么我没有收到此代码的警告:
x << 3? 因为左侧操作数x可以是有符号或无符号类型。标准不限制x只能是无符号类型,即它可以是有符号类型,即它可以包含负值。 -
但是你确实收到
y = z << -4;(你的最后一句话)的警告。编译器试图提供帮助,但它不运行代码,以确定x是否始终为负。如果x的值是运行时的用户输入,它甚至可能知道。
标签: c warnings undefined-behavior gcc-warning gcc9