注意:这个问题是关于位移运算符 << 和 >>的第二个操作数的符号性。完全不是关于第一个操作数。
CERT INT34-C,部分:不要移动负数的位......
并不是说它需要证明,而是他们证明说这是未定义的行为是正当的。
我会认为该规则是有意义的,因为如果您想以另一种方式移动,请使用适当的移位运算符为另一个方向移动正数位。
因此,如果在 C 语言中,移位负数位既没有必要也没有定义,为什么 << 或 >> 的第二个操作数甚至允许有符号?
例如,MISRA-C:2004(无论您认为 MISRA 喜欢还是不喜欢)在其第 6.10.2 节中,作为解释结果类型仅取决于第一个操作数的副作用,说“第二个操作数可以是任何有符号或无符号整数类型”。[强调我的]
为什么要邀请人们在位移中使用有符号的第二个操作数?为什么允许?有没有编译器警告过它?