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