如果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
但是我看不到任何错误或警告,为什么?你能帮我吗?
答案 0 :(得分:2)
如果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_MIN ... INT_MAX]范围内的int
和其[0 ... UINT_MAX]范围内的unsigned
,并确保比较{{1 }}失败,代码可以使用:
-1, UINT_MAX