例如,在C中,为什么允许第二个移位操作符被签名?

tal*_*ity 5 c shift signedness operand

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

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

并不是说它需要理由,但他们证明这是不确定的行为.

我本以为这条规则很有意义,因为如果你想换另一条路,那么使用适当的移位算子移动另一个方向的正位数.

因此,如果在C中,移位负位数是不必要的和未定义的,为什么<<或>>的第二个操作数甚至允许被签名?

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

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

pmg*_*pmg 4

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

3表达式中a <<= 3;是一个int。
如果通过 a 换乘int是非法的,那么您就必须这样做a <<= 3U;

使按有符号值进行移位非法会破坏很多(我的意思是很多)代码!