XC8 中的不匹配比较
mismatched comparison in XC8
将定义 EUSART_BUFFER_SIZE 与类型 uint8_t 的变量 eusart_rx_buffer_rd 进行比较时的不匹配比较。但是,如果变量的类型更改为 uint16_t,则警告消失。为什么?
#define EUSART_BUFFER_SIZE 256
uint8_t eusart_rx_buffer_rd = 0;
if (eusart_rx_buffer_rd >= EUSART_BUFFER_SIZE)
{
eusart_rx_buffer_rd = 0;
}
文字常量 256 的隐式类型是 int
,因此您正在比较 int
和 uint8_t
。
比较本身导致对 int
的隐式提升,但在任何情况下 总是 错误,因为 256 不能用 uint8_t
表示。
目前尚不清楚合适的解决方案是什么,但如果 uint8_t
变量的所有值都有效,则测试没有任何意义,对更大类型的天真更改实际上可能会引入错误通过允许分配无效值。
将定义 EUSART_BUFFER_SIZE 与类型 uint8_t 的变量 eusart_rx_buffer_rd 进行比较时的不匹配比较。但是,如果变量的类型更改为 uint16_t,则警告消失。为什么?
#define EUSART_BUFFER_SIZE 256
uint8_t eusart_rx_buffer_rd = 0;
if (eusart_rx_buffer_rd >= EUSART_BUFFER_SIZE)
{
eusart_rx_buffer_rd = 0;
}
文字常量 256 的隐式类型是 int
,因此您正在比较 int
和 uint8_t
。
比较本身导致对 int
的隐式提升,但在任何情况下 总是 错误,因为 256 不能用 uint8_t
表示。
目前尚不清楚合适的解决方案是什么,但如果 uint8_t
变量的所有值都有效,则测试没有任何意义,对更大类型的天真更改实际上可能会引入错误通过允许分配无效值。