2

在 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 规则在起作用,或者这只是一个编译器错误?

4

2 回答 2

4

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

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

我了解操作数被提升为 int

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

于 2017-10-23T11:01:20.797 回答
0

正如已经指出的那样,文字是本机 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);
于 2017-10-24T14:25:21.190 回答