根据C11标准6.5.7p3(对于早期版本基本相同): “如果右操作数的值为负或大于等于提升后的左操作数的宽度,则行为未定义。” 换句话说:未定义的行为。准备好迎接鼻妖。 简而言之:不要 注意:虽然许多程序员都知道并避免负移位计数,但往往忽略了也会出现计数>=值的位大小未定义的情况。如果unsigned int具有32位或更少位,则这使得像((unsigned int)1 << 32) - 1这样的东西实际上是未定义的。对于带符号值,由于符号的原因,事情变得更加复杂(感谢@chux指出)。这是一个常见的陷阱。对于某些实现,可能会发生常量表达式(编译时评估)和运行时评估的不同结果。
C 中的按位左移运算符: 数据的二进制模式可以左移指定数量的位置 当数据向左移动时,尾部零会被填充为 0。 左移运算符是一个二元运算符 [Bi - 两个] 二进制意味着需要两个参数的运算符! 语法: **[variable]<<[number of places]** 如果位置数变为负数,它将变为未定义。