如果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 == bar
,foo8
和bar
都被提升为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 == bar
,foo32
成为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代码比较不同的数据类型,如何获得警告?的主要内容,如果未能解决你的问题,请参考以下文章