从 boolean 到 unsigned int 的奇怪转换导致最终结果错误

问题描述 投票:0回答:1

我们在单元测试框架内使用一些断言函数,“隐式”在断言宏内执行强制转换。我隐含地说是因为在我们深入研究 .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

c casting boolean
1个回答
0
投票

我不确定,但我认为这种副作用是由于演员的位置造成的。

在您的示例中,

-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);
}
© www.soinside.com 2019 - 2024. All rights reserved.