注意:这个问题是关于位移位操作符第二个操作数的符号性<<和>>。与第一个操作数完全无关
CERT INT34-C, in part: Do not shift a负数位…
不需要理由,但他们证明说这是未定义的行为。
我本以为这个规则是有意义的,因为如果你想向另一个方向移动,使用合适的移位算子在另一个方向上移动正数位。
那么,如果在C语言中,没有必要且没有定义移动一个负数位,为什么<<或者>>甚至被允许签名?
例如,MISRA- c:2004(不管你认为MISRA喜欢或不喜欢)在其第6.10.2节中,作为解释结果类型仅取决于第一个操作数的副作用,说"第二个操作数可以是任何有符号或无符号整数类型"。(强调我)
为什么邀请人们在位移位中使用带符号的第二个操作数?为什么要允许呢?编译器会对它发出警告吗?
我真的说不出为什么事情是这样的…但我很高兴我可以通过有符号值移动:
表达式a <<= 3;
中的 3
为整型。
如果通过int
移动是非法的,则必须使用a <<= 3U;
。
通过带符号的值进行非法移动会破坏很多(我的意思是 a lot )的代码!