#define INIT_VALUE 1u
typedef unsigned int uint32_t;
typedef signed int int32_t;
void do_test(uint32_t var1, int32_t var2);
void do_test(uint32_t var1, int32_t var2)
{ uint32_t m_var = INIT_VALUE;
m_var = (m_var << 1) + (var1 + var2);
}
此代码违反了规则10.4,原因是无符号var1和有符号var2。
我试过将其中一个变量转换为另一个变量。但这不是一种通用的方式。
有办法做到这一点吗?
规则10.4是一个合理的规则,因为它防止了可能导致签名性变化的隐式类型转换。这就是代码中发生的情况,var1 + var2
导致var2
被静默地提升为无符号类型。这是不好的,因为这个变量一开始就被签名肯定是有原因的。
只需确保在算法中跟踪签名性即可。如果有符号变量的值为负值,那么隐式转换为无符号变量就是一个错误。否则,如果您知道值总是正的,因此有符号性无关紧要,那么只需将有符号变量强制转换为uint32_t
。