intN_t和uintN_t之间的比较

时间:2013-05-02 16:52:18

标签: c

我很困惑。例如:

int x=-1; 
unsigned y=0;
(x<y) ----> false

int8_t x=-1;
unint8_t y=0;
(x<y) ----> true

此外,编译器会在第一次比较时发出警告,但不会在第二次比较时发出警告。似乎是

  • (int vs unsigned) - int提升为unsigned
  • (intN_t vs uintN_t) - uintN_t提升为intN_t

为什么会有这种行为?喜欢......真的吗?

2 个答案:

答案 0 :(得分:3)

每当您将一个二进制算术运算符(包括比较)应用于一对短于int的数字类型时,C在执行操作之前将两个操作数转换为int

每当您将任何二进制算术运算符应用于大小相同,符号不匹配且短于int的数字类型时,C会将带符号的操作数转换为无符号在手术前。

这是两个“integer promotion”规则。它们不是非常直观,如果今天从头开始设计C,它们可能不是人们会做的事情,但它们就是它们,我们坚持使用它们。

答案 1 :(得分:2)

这是通常的整数转换的结果。

在第一种情况下,两个操作数的排名至少为int,并具有相同的排名,因此它们将转换为无符号整数类型。

在第二种情况下,int8_tchar(必须是,如果它存在的话),所以两个操作数都被提升为int-10都可以在int中表示,因此没有警告。