【问题标题】:Comparison between intN_t and uintN_t [duplicate]intN_t 和 uintN_t 之间的比较 [重复]
【发布时间】:2013-04-26 22:49:09
【问题描述】:

我很困惑。示例:

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

为什么会有这种行为?就像……真的吗?

【问题讨论】:

  • int8_t 和 uint8_t 是字符
  • @0A0D int16_t, int32_t, ..的结果相同
  • @PeteFordham:见 ecatmur 的回答。

标签: c


【解决方案1】:

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

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

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

【讨论】:

  • short 不能是 8 位,它要求至少能够表示区间 [-32767, 32767](是的,不是 -32768,因为 C99 奇怪地认为非-twos-complement 算术仍然值得费心支持)。但是,如果char 大于 8 位,int8_t 可能是一个特殊的扩展类型。
  • 如果 char 大于 8 位,您可能不会有 int8_t (它是实现可选的类型之一,因为标准编写者希望有人会实现 C99 UNIVAC 在某处运行)。
  • @Zack 哦,当然;忘记了最小尺寸。
【解决方案2】:

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

每当您将任何二元算术运算符应用于大小相同、符号不匹配且短于int 的一对数字类型时,C 都会在操作。

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

【讨论】:

    猜你喜欢
    • 2013-02-27
    • 1970-01-01
    • 2010-11-19
    • 2021-09-14
    • 1970-01-01
    • 1970-01-01
    • 2020-10-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多