在 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);
在 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);