m43*_*dr3 7 c embedded autosar
以下宏来自微控制器的 MCAL 源,它将计时器滴答声转换为毫秒。
#define TICKS2MS(x) ( (uint64) (((((uint64)(x)) * 1) + 0) / 100000) )
Run Code Online (Sandbox Code Playgroud)
你能帮我理解乘以1加0的意义吗?
事实上,乘法和加法是没有意义的,外部转换也是如此。
两个运算符都对两个操作数执行通常的算术转换。
对于乘法,左操作数的类型为uint64(作为强制转换的结果),右操作数的类型为int。由于uint64是较大的类型,因此它将是结果的类型。操作数1不会因转换而改变值,因此乘以1结果具有与 相同的类型和值(uint64)(x)。
类似地,对于加法,操作数的类型分别为uint64和int,这意味着结果类型为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)