宏中看似毫无意义的操作

m43*_*dr3 7 c embedded autosar

以下宏来自微控制器的 MCAL 源,它将计时器滴答声转换为毫秒。

#define TICKS2MS(x)     ( (uint64) (((((uint64)(x)) * 1) + 0) / 100000) )  
Run Code Online (Sandbox Code Playgroud)

你能帮我理解乘以1加0的意义吗?

dbu*_*ush 3

事实上,乘法和加法是没有意义的,外部转换也是如此。

两个运算符都对两个操作数执行通常的算术转换。

对于乘法,左操作数的类型为uint64(作为强制转换的结果),右操作数的类型为int。由于uint64是较大的类型,因此它将是结果的类型。操作数1不会因转换而改变值,因此乘以1结果具有与 相同的类型和值(uint64)(x)

类似地,对于加法,操作数的类型分别为uint64int,这意味着结果类型为uint64, 并且0在转换后不会改变值。因此,通过添加 0,结果具有与(uint64)(x) * 1具有相同类型和值的相同类型和值(uint64)(x)

最后的强制转换也是多余的,因为强制转换的表达式已经具有类型uint64。如上所述,除法运算符对其操作数执行通常的算术转换,因此将 a 除以uint64an会得到inta uint64

所以上面的宏相当于:

#define TICKS2MS(x)     ((uint64)(x) / 100000)
Run Code Online (Sandbox Code Playgroud)