C (XC8) 使用三元运算符隐式有符号到无符号转换

标签 c type-conversion xc8

我正在尝试根据蒙版将颜色设置为前景或背景 (fg/bg)。

uint8_t bitmap, mask, bg, fg = <whatever>;

此代码有效:

uint8_t color = bg;
if (bitmap & mask)
{
    color = fg;
}

此代码也有效但会引发警告:(373) 隐式有符号到无符号的转换

uint8_t color = (bitmap & mask) ? fg : bg;

谁能解释一下为什么?我使用的是 Microchip XC8 2.30。

最佳答案

编译器警告您三元表达式的类型是 int,一个有符号类型,而赋值对象的类型是 uint8_t,一个无符号类型。在表达式中混合使用有符号和无符号类型会导致违反直觉的行为,例如 sizeof(int) > -1 为 false。

它还可能会警告您,将 int 值存储到 unt8_t 变量中可能会导致隐式转换,从而更改该值。但在这种特殊情况下,范围分析可以轻松证明此表达式的任何可能结果都在 uint8_t 类型的范围内,因此上述情况都不需要警告。这个编译器令人讨厌而且不够聪明。

警告可以通过额外的强制转换来消除:

uint8_t color = (uint8_t)((bitmap & mask) ? fg : bg);

但是这种无用的转换混淆了代码并使读者感到困惑。在大多数情况下应避免转换,因为它们会导致虚假错误。

您最好的解决方案似乎是保留 if 语句。编译器实际上可能会为此解决方案生成更快的代码,因为它是条件存储指令的理想候选者,可生成高效的无分支代码。

关于C (XC8) 使用三元运算符隐式有符号到无符号转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66899208/

相关文章:

C 的 printf 和 fprintf(stdout,) 不打印

c++ - Gtk+ GtkComboBox 插入 GtkWidget 而不是字符串

c - 查找元素是否在指定数组中

c - XC8 编译器是否支持弱符号?

创建字符串数组而不分配每个字符串

c++ - nullptr 可以用作变量参数(varargs)吗?

string - 使用 map 和 toInt 将字符串转换为 Scala 中的数字集合

C:检查数组是否包含相等的连续元素

c - XC8 中的不匹配比较

c - 如何使用 C 宏来定义 PIC 微 Controller 引脚名称?