c语言 - XC8 V1.44 中按位 OR 处理文本时的间歇性转换警告



在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 行发出警告:

警告:(752) 转换为较短的数据类型

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

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

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

在所有这些行上,int在分配时隐式转换为uint8_t(左值转换)。未损坏的工具将报告每一行或根本没有任何行。

我知道操作数被提升为 int

不,它们不是,因为整数文本始终是int类型。

如前所述,文字是本机整数大小(例如,对于 16 位 PIC,int16_t),编译器有时会警告 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);

相关内容

  • 没有找到相关文章

最新更新