5

注意:这个问题是关于位移运算符 << 和 >>的第二个操作数的符号性。完全不是关于第一个操作数。

CERT INT34-C,部分:不要移动负数的位......

并不是说它需要证明,而是他们证明说这是未定义的行为是正当的。

我会认为该规则是有意义的,因为如果您想以另一种方式移动,请使用适当的移位运算符为另一个方向移动正数位。

因此,如果在 C 语言中,移位负数位既没有必要也没有定义,为什么 << 或 >> 的第二个操作数甚至允许有符号?

例如,MISRA-C:2004(无论您认为 MISRA 喜欢还是不喜欢)在其第 6.10.2 节中,作为解释结果类型仅取决于第一个操作数的副作用,说“第二个操作数可以是任何有符号或无符号整数类型”。[强调我的]

为什么要邀请人们在位移中使用有符号的第二个操作数?为什么允许?有没有编译器警告过它?

4

1 回答 1

4

我真的不能说为什么事情是这样的......但我很高兴我可以通过带符号的值进行转换:

3在表达式a <<= 3;中是一个 int。
如果换档int是非法的,你就必须这样做a <<= 3U;

将有符号值的移位设为非法会破坏很多(我的意思是很多)代码!

于 2011-04-14T13:44:35.770 回答