【发布时间】:2021-05-30 21:21:35
【问题描述】:
#include <stdio.h>
int main() {
unsigned int i = 23;
signed char c = -23;
if (i<c)
puts("TRUE");
return 0;
}
为什么以下程序的输出是 TRUE,即使我使用了可以存储从 -128 到 127 的有符号字符。
【问题讨论】:
-
默认整数促销。两个变量都转换为
unsigned int,并且-23因为unsigned int比23大很多。打印值以查看。请参阅 C11 §6.3.1.1 Conversions / Arithmetic operands / Booleans, characters and integers 和 §6.3.1.8 Usual arithmetic conversions。 -
注意,这就是为什么比较具有不同符号的类型是危险的。强烈建议使用
-Wextra标志进行编译,当发现此类比较时,gcc 和 clang 都会生成警告。 gcc 的 警告:不同符号的整数表达式的比较:'unsigned int' 和 'signed char' [-Wsign-compare],clang 的类似。
标签: c