在XC8 V1.44中按位OR文字时的间歇转换警告

时间:2017-10-23 10:13:29

标签: c pic xc8

在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规则或者这仅仅是编译器错误?

2 个答案:

答案 0 :(得分:4)

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

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

  

我理解操作数被提升为int

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

答案 1 :(得分:0)

正如已经指出的那样,文字是原生的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);