宏中看似毫无意义的操作
Seemingly pointless operations in a macro
以下宏来自微控制器的 MCAL 源,它将定时器滴答声转换为毫秒。
#define TICKS2MS(x) ( (uint64) (((((uint64)(x)) * 1) + 0) / 100000) )
你能帮我理解乘1加0的意义吗?
乘法和加法实际上是没有意义的,外部转换也是如此。
两个运算符都对两个操作数执行通常的算术转换。
对于乘法,左操作数的类型为 uint64
(作为转换的结果),右操作数的类型为 int
。由于 uint64
是较大的类型,因此它将是结果的类型。操作数 1
不会因转换而改变值,因此乘以 1
结果与 (uint64)(x)
.
具有相同的类型和值
与加法类似,操作数的类型分别为uint64
和int
,即结果类型为uint64
,0
后的值不变转换。因此,通过添加 0,结果具有与 (uint64)(x) * 1
相同的类型和值,而 (uint64)(x) * 1
具有与 (uint64)(x)
.
相同的类型和值
末尾的转换也是多余的,因为转换的表达式已经具有类型 uint64
。如上所述,除法运算符对其操作数执行通常的算术转换,因此将 uint64
除以 int
结果为 uint64
.
所以上面的宏等价于:
#define TICKS2MS(x) ((uint64)(x) / 100000)
我看到单词 MCAL、TICKS2MS(x)
和 uint64
(不是 stdint.h
中的 uint64_t
).. 在我看来这是一个 AUTOSAR 环境. (您应该在问题中添加 autosar
标签)
不同的显式转换很可能是由于 MISRA-C 检查造成的。 MISRA-C 检查工具对此非常挑剔。
如果该宏 TICK2MS(x)
是 xxx_Cfg.h
或 xxx_PBCfg.h
的一部分(其中 xxx
类似于 Gpt
、Mcu
或 Os
),那么它很可能是由 AUTOSAR/MCAL 驱动程序配置工具生成的。然后,因子、偏移量和分频器可能是调整预分频器的一部分,可能是 TimerMaxValue(环绕)或由于奇数 prescaler/frequency 对滴答星座的校正,以纠正故障。如果配置不使用此类功能,则默认值可能由配置工具生成。
由于宏只包含常量,编译器可以将其优化为简单的 ((uint64)(x) / 100000)
.
以下宏来自微控制器的 MCAL 源,它将定时器滴答声转换为毫秒。
#define TICKS2MS(x) ( (uint64) (((((uint64)(x)) * 1) + 0) / 100000) )
你能帮我理解乘1加0的意义吗?
乘法和加法实际上是没有意义的,外部转换也是如此。
两个运算符都对两个操作数执行通常的算术转换。
对于乘法,左操作数的类型为 uint64
(作为转换的结果),右操作数的类型为 int
。由于 uint64
是较大的类型,因此它将是结果的类型。操作数 1
不会因转换而改变值,因此乘以 1
结果与 (uint64)(x)
.
与加法类似,操作数的类型分别为uint64
和int
,即结果类型为uint64
,0
后的值不变转换。因此,通过添加 0,结果具有与 (uint64)(x) * 1
相同的类型和值,而 (uint64)(x) * 1
具有与 (uint64)(x)
.
末尾的转换也是多余的,因为转换的表达式已经具有类型 uint64
。如上所述,除法运算符对其操作数执行通常的算术转换,因此将 uint64
除以 int
结果为 uint64
.
所以上面的宏等价于:
#define TICKS2MS(x) ((uint64)(x) / 100000)
我看到单词 MCAL、TICKS2MS(x)
和 uint64
(不是 stdint.h
中的 uint64_t
).. 在我看来这是一个 AUTOSAR 环境. (您应该在问题中添加 autosar
标签)
不同的显式转换很可能是由于 MISRA-C 检查造成的。 MISRA-C 检查工具对此非常挑剔。
如果该宏 TICK2MS(x)
是 xxx_Cfg.h
或 xxx_PBCfg.h
的一部分(其中 xxx
类似于 Gpt
、Mcu
或 Os
),那么它很可能是由 AUTOSAR/MCAL 驱动程序配置工具生成的。然后,因子、偏移量和分频器可能是调整预分频器的一部分,可能是 TimerMaxValue(环绕)或由于奇数 prescaler/frequency 对滴答星座的校正,以纠正故障。如果配置不使用此类功能,则默认值可能由配置工具生成。
由于宏只包含常量,编译器可以将其优化为简单的 ((uint64)(x) / 100000)
.