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