【发布时间】:2017-12-29 07:46:30
【问题描述】:
根据this questions的回答:
E1 的结果是E1左移E2位位置;空出的位用零填充。如果 E1 具有无符号类型,则结果的值为 E1 × 2E2,比结果类型。如果 E1 有带符号类型和非负值,并且 E1 × 2E2 在结果类型中是可表示的,那么这就是结果值;否则,行为未定义。
这似乎暗示 1 << 31 未定义。
但是,如果我使用1 << 31,GCC 不会发出警告。
它确实为1 << 32 发行了一份。
link
那是什么?我误解了标准吗? GCC有自己的解释吗?
【问题讨论】:
-
@BrianCain 不,应该作为 this 的副本关闭
-
这里有两个单独的问题:(a) is
1 << 31undefined(许多现有问题已经涵盖),以及 (b) 为什么 gcc 不给出警告;这不是语言律师的问题。我建议将问题编辑为显然是这两个之一,但不是两者都 -
监视 UB 是你的责任,而不是编译器的。编译器可能会也可能不会通过发出警告来帮助您。
标签: c language-lawyer undefined-behavior bit-shift