1 。misra不管operator两边是expression还是变量,基本类型类别必须一样
比如S8>u8 不行, u16>u32 可以
2。 如果operand是expression,那要求就多了。
参看rule10.7
u32+u16+16是可以,因为所有的operand在内存中实际都是按照u32来执行的,不会有精度损失问题。
U32+(u16+u16)不可以,因为(u16+u16)内存中实际是按u16计算,如果相加溢出则舍去。这个时候再和一个wider的u32相加,那coder的意图很有可能是不想有任何精度损失的,只是后面可能是表示一个整体就先算了。所以misra不允许这种。
那u32 &(u16+u16)也不行, u32&u16是可以的。
3, #1,#2讲的类似的内容, 还有个不容易理解的点
u32(u16+u16) 这种强制转换也不行,参见rule10.8.
在16bit机器和32bit机器上会算出不同的结果。 虽然工作当中都是32bit机器,不会有任何问题,算出来的值不会有丢失。但是你写code的出发点是可移植的。