例如,在C语言中,为什么允许shift的第二个操作数有符号?



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

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 )的代码!

最新更新