在 XC8 V1.44 中按位或运算文字时出现间歇性转换警告

Intermittent conversion warnings when bitwise OR'ing literals in XC8 V1.44

在 XC8 (v1.44) 项目中编写一些位掩码值时,我发现了这个相当奇怪的行为:

1:    uint8_t foo;
2:    foo = 0x01;
3:    foo = 0x01 | 0x02;
4:    foo = 0x01 | 0x02 | 0x04;
5:    foo = 0x01 | 0x02 | 0x04 | 0x08;

第 3 行和第 5 行发出警告:

warning: (752) conversion to shorter data type

而第 4 行没有。 我知道操作数在执行 OR 操作之前被提升为 int,这就是缩小警告的来源。但是,为什么它只在某些行上警告而不在其他行上警告?

是否有某种晦涩的 C 规则在起作用,或者这只是一个编译器错误?

这只是另一个编译器错误,PIC 编译器非常臭名昭著。

在所有这些行中,int 在赋值时被隐式转换为 uint8_t(左值转换)。未损坏的工具会报告每一行或根本不报告任何行。

I understand the operands are promoted to int

不,它们不是,因为整数文字总是以 int 类型开头。

正如已经指出的那样,文字是本机 int 大小(例如 int16_t 对于 16 位 PIC)并且编译器有时会警告 MSB 丢失。我从未见过 PIC 编译器在处理文字时抱怨符号更改。

解决方案当然是将结果转换为 uint8_t。您还可以使用无符号文字来防止像 lint 这样的工具抱怨符号冲突。

uint8_t foo;
foo = (uint8_t)(0x01U);
foo = (uint8_t)(0x01U | 0x02U);
foo = (uint8_t)(0x01U | 0x02U | 0x04U);
foo = (uint8_t)(0x01U | 0x02U | 0x04U | 0x08U);