misra

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的出发点是可移植的。


你可能感兴趣的:(c语言-程序优化,c语言)