全部学习汇总: GitHub - GreyZhang/misra_c_hacking: MISRA C, I'm coming! Happy hacking!

1208_MISRA_C规范学习笔记_Rule 10.3 Rule 10.5_嵌入式

如果将按位操作符~和<<应用于基础类型unsigned char或unsigned short的操作数,则结果应立即转换为该操作数的基础类型。

看了一下这一条规则,我觉得如果拿这一条规则来考察我现在接触到的一群工程师的话,估计十之八九会全都栽跟头。当然,这样的操作在现在的软硬件开发平台上用到的不多是一个原因。另一个原因自然还是基本功并不是很扎实。

为什么要在这里来一个强制数据类型转换呢?主要是考虑到这样的操作可能会引起数据类型的隐形扩充。从移位的操作来考虑比较容易考虑明白,因为左移在一定程度上就代表这乘以一个大于1的数值,很可能在操作的时候遇到数据表达的范围出现不够用,最终结果出现了数据溢出这样的情况。

关于按位取反的操作,需要注意一点是这个操作会把一个数据扩展为相关平台的整形来进行处理。这样,如果处理的数据类型是8bit之类的短类型,在进行按位取反的时候可能就会多出来一些位。因此,类似的操作在处理的时候加上一个强制数据类型转换可以保证数据可以截断。

小结:这是一条一看就懂,但是不看很少考虑的规则。可能正好是自己用的不算多,这方面没栽过坑,因此这方面没有太多的关注。后续在代码编写以及阅读的时候需要留心了,可能会有bug不经意之间被引入。