我很困惑。例如:
int x=-1;
unsigned y=0;
(x<y) ----> false
int8_t x=-1;
unint8_t y=0;
(x<y) ----> true
此外,编译器会在第一次比较时发出警告,但不会在第二次比较时发出警告。似乎是
为什么会有这种行为?喜欢......真的吗?
答案 0 :(得分:3)
每当您将一个二进制算术运算符(包括比较)应用于一对短于int
的数字类型时,C在执行操作之前将两个操作数转换为int
。
每当您将任何二进制算术运算符应用于大小相同,符号不匹配且不短于int
的数字类型时,C会将带符号的操作数转换为无符号在手术前。
这是两个“integer promotion”规则。它们不是非常直观,如果今天从头开始设计C,它们可能不是人们会做的事情,但它们就是它们,我们坚持使用它们。
答案 1 :(得分:2)
这是通常的整数转换的结果。
在第一种情况下,两个操作数的排名至少为int
,并具有相同的排名,因此它们将转换为无符号整数类型。
在第二种情况下,int8_t
是char
(必须是,如果它存在的话),所以两个操作数都被提升为int
。 -1
和0
都可以在int
中表示,因此没有警告。