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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如果C代码比较不同的数据类型,如何获得警告?相关的知识,希望对你有一定的参考价值。

如果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

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

答案

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

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

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

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

转换可能会改变价值。例如。 int -1 - > unsigned UINT_MAX


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

随着下面的foo8 == barfoo8bar都被提升为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在其[INT_MIN ... INT_MAX]范围内与unsigned在[0 ... UINT_MAX]范围内进行比较,并确保比较-1, UINT_MAX失败,代码可以使用:

// if (foo32 == bar) return 2;
if (bar >= 0 && foo32 == (unsigned)bar) return 2;

以上是关于如果C代码比较不同的数据类型,如何获得警告?的主要内容,如果未能解决你的问题,请参考以下文章

C ++如何禁用具有不同符号变量比较的特定行的编译器警告?

《代码大全》阅读笔记-12-基本数据类型

在 C 中获得“atoi”功能的警告

菜单的C“指针和整数之间的比较”警告

如何使用泛型避免类型安全警告[重复]

NSArray 与 C 类型?