【问题标题】:What are the general rules for comparing different data types in C?在 C 中比较不同数据类型的一般规则是什么?
【发布时间】:2011-10-01 23:34:12
【问题描述】:

假设我有以下场景:

int i = 10;
short s = 5;

if (s == i){
   do stuff...
} else if (s < i) {
  do stuff...
}

当 C 进行比较时,它是转换较小的数据类型,在本例中为 int,还是将右侧的数据类型转换为左侧的数据类型? 在这种情况下 int 短?

【问题讨论】:

  • 在 C 中,一般规则是请不要那样做。但在您的示例中,short 将被提升为 int

标签: c comparison types


【解决方案1】:

数据类型是某种抽象......就计算机而言,没有intshort。有内存,就有数据。

当你说 int x 时,你是在对计算机说“给我足够的字节来存储一个 int”,当你说 short y 时,你是在说......你猜对了。

short,正如您所期望的那样,比int 占用更少的字节,因此可能(并且经常)包含相邻字节中的数据。在比较不同类型的数据时,问题是“相邻位会导致结果偏斜吗?”

当您比较两种不同的数据类型时,您实际上是在比较存储在两个不同位置的位。为表示数据而存储的单个位的最大数量需要相同大小才能进行比较

Casting 用于帮助解决此问题。

【讨论】:

    【解决方案2】:

    来自Type Conversions

    第 44 页上的隐式转换集虽然是非正式的陈述,但正是现在要记住的集。如果您注意到,正如作者所说,the `lower' type is promoted to the `higher' type,'' where theorder'' 的类型是

    char < short int < int < long int < float < double < long double
    

    这条规则很容易记住——“从低到高”——但对于有符号和无符号整数类型并没有多大帮助,这些在 Oli 的帖子中得到了很好的解释。但它很容易记住并且在大多数情况下对您有帮助。

    【讨论】:

    • unsigned 如何适合那里? -1 是否小于 2U
    • 你说得对,这只是整个故事的一部分。我会考虑到这一点。
    • +1:标志确实应该是&lt;=,而在C99中,有long long int会增加混乱:)
    【解决方案3】:

    这由通常的算术转换控制。对于简单的情况,一般的经验法则是转换具有“较少”精度的类型以匹配具有“更多”精度的类型,但是一旦您开始混合使用signedunsigned,它就会变得有些复杂。

    在 C99 中,第 6.3.1.8 节对此进行了描述,为方便起见,我将其包括在此处:

    • 首先,如果任一操作数对应的实数类型为long double, 另一个操作数被转换, 不改变类型域,到 对应的实数类型是 long double.

    • 否则,如果任一操作数对应的实数类型为double, 另一个操作数被转换, 不改变类型域,到 对应的实数类型是 double.

    • 否则,如果任一操作数对应的实数类型为float, 另一个操作数被转换, 不改变类型域,到 对应的实数类型是 float.

    • 否则,整数提升将在两个操作数上执行。然后 以下规则适用于 提升的操作数:

      • 如果两个操作数的类型相同,则不再进行转换 需要。
      • 否则,如果两个操作数都具有有符号整数类型或两者都具有 无符号整数类型,操作数 具有较小整数的类型 转换等级转换为 具有更高等级的操作数的类型。
      • 否则,如果无符号整数类型的操作数有秩 大于或等于 另一个操作数的类型,然后 带符号整数类型的操作数是 转换为操作数的类型 无符号整数类型。
      • 否则,如果带符号整数类型的操作数的类型可以 代表所有的值 无符号操作数的类型 整数类型,然后是操作数 无符号整数类型转换为 带符号的操作数的类型 整数类型。
      • 否则,两个操作数都转换为无符号整数类型 对应的类型 带符号整数类型的操作数。

    我已经突出显示了适用于您的特定示例的部分。

    整数转换排名的概念在第 6.3.1.1 节中定义,它基本上描述了您可能期望的内容(精度较低的类型的排名低于精度较高的类型)。

    【讨论】:

      【解决方案4】:

      作为一般规则,如果两个值的类型不同,C 将不会比较它们,并且永远不会将变量隐式转换为精度较低的类型。在您的示例代码中,short 被提升为int,相当于这样写:

      int i = 10;
      short s = 5;
      
      if ((int)s == i){
         do stuff...
      } else if ((int)s < i) {
        do stuff...
      }
      

      这将完全符合您的预期,但有符号/无符号比较的情况并非如此。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-06-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-04-08
        • 1970-01-01
        • 2010-10-24
        • 1970-01-01
        相关资源
        最近更新 更多