如果C代码比较不同的数据类型,如何获得警告?

时间:2018-09-12 09:54:32

标签: c gcc arm

如果C代码中的开发人员正在比较不同的数据类型,我想看到警告或错误。我正在使用gcc arm none eabi,并且已经分别尝试了以下代码和以下编译器标志。

uint8_t foo = 0;
int16_t bar = -1;

int main() {
  while(1) {
    if (foo==bar) return 0;
  }
}

编译器选项

-Wsign-compare -Wall -Wextra

但是我看不到任何错误或警告,为什么?你能帮我吗?

1 个答案:

答案 0 :(得分:2)

  

如果C代码比较不同的数据类型,如何获得警告?

==使两个操作数按照其相对的整数转换等级进行隐式转换。为了得到警告,请进行比较,在整数提升之后,操作数的符号不同。

  
    

如果int可以表示原始类型的所有值(受位字段的宽度限制),则该值将转换为int;否则,它将转换为unsigned int。这些称为整数促销。 C11dr§6.3.1.12

  

要记住的一个关键概念是,整数促销永远不会更改,而只会更改类型。没有值的变化,比较就不会发生“意外”。

该转换可能会更改。例如。 int -1-> unsigned UINT_MAX


  

我看不到任何错误或警告,为什么?

在下面的foo8 == bar中,foo8bar都被提升为int没有什么可警告的。对于bar, foo8的所有值组合,比较定义良好-毫不奇怪。那是C。

uint8_t foo8 = 0;
int16_t bar = -1;
uint32_t foo32 = 0;

int main(void) {
  if (foo8 == bar)  return 1;
  if (foo32 == bar) return 2;
}

使用foo32 == barfoo32成为unsigned(或unsigned long),并且bar被提升为int。使用各种编译器选项,您很容易收到类似

的警告
warning: comparison between signed and unsigned integer expressions [-Wsign-compare]

在后一种情况下,要比较其[INT_MIN ... INT_MAX]范围内的int和其[0 ... UINT_MAX]范围内的unsigned,并确保比较{{1 }}失败,代码可以使用:

-1, UINT_MAX