我们在单元测试框架内使用一些断言函数,“隐式”在断言宏内执行强制转换。我隐含地说是因为在我们深入研究 .h 文件时完全发现它之前,程序员是看不到强制转换的..
无论如何,问题是,我们有一个进行乘法的函数:
int16_t i16_compute_mult(int8_t __i8_a, int8_t __i8_b)
{
return (((int16_t) __i8_a) * ((int16_t) __i8_b));
}
在单元测试示例中,我们正在测试:
assert_true(i16_compute_mult(2,-2)==-4)
返回 false 而
assert_true(i16_compute_mult(-2,2)==-4)
返回 true !!
作为信息,assert_true 宏包含对 unsigned long long int 的强制转换,因此最后,assert_true(c) 与 (unsigned long long int)(c) 相同
如果我们使用中间 int16_t 变量从 i16_compute_mult 获取结果,而不是直接将 i16_compute_mult 函数和参数放入宏中,那么结果是正确的..
所以我们绝对不明白为什么这个演员在这里有不好的影响。
Gcc编译器版本为 Ubuntu 9.4.0-1ubuntu1~20.04.2 编译器选项是 -Wall -fno-exceptions -fprofile-arcs -ftest-coverage
我不确定,但我认为这种副作用是由于演员的位置造成的。
在您的示例中,
-2
可以用0xFE
表示,因此您的函数执行乘法0x00FE * 2
而不是0xFFFE * 2
。
要解决此问题,您可以按如下方式修改您的函数
int16_t i16_compute_mult(int8_t __i8_a, int8_t __i8_b)
{
return (int16_t)(__i8_a * __i8_b);
}