为什么以下代码会打印" S更大"即使s较小?

时间:2016-06-09 21:31:58

标签: c if-statement int sizeof

以下代码片段无法按预期工作,以下程序的输出为" S为Bigger"在Ubuntu机器上使用GCC编译时。虽然变量s是-1并且明显小于sizeof(缓冲区)20,但仍然打印 S更大

我唯一可以做出的逻辑假设就是C正在转换变量" s"到无符号整数并在&#34中使用;如果"条件。 如果我的假设是正确的,为什么C正在这样做,或者如果我错了,为什么这个片段会给出这个令人困惑的输出。

#include <stdio.h>

int main(void) {

    int s = -1;
    char buffer[20];

    if(s > sizeof(buffer)){
        printf("S is Bigger");
    }
    return 0;
}

2 个答案:

答案 0 :(得分:4)

this问题的回答

  

如果int为零或正数,则安全。如果它是负数,并且size_t等于或高于int,则int将转换为size_t,因此其负值将变为正值。

sizeof()返回size_t

答案 1 :(得分:3)

您是对的,编译器会将s转换为unsigned int数据类型size_t(这是sizeof运算符的返回值)。所以比较成了(在我的系统中size_t是64位):

if (18446744073709551615 > 20)

这显然是真的;)

这是标准定义的隐式转化的一部分。相关部分是标准的6.3.1.8中的“常用算术转换”。

另请参阅此post和其他post

基本规则:

  • 如果两个操作数具有相同的类型,则无需进一步转换。
  • 如果两个操作数具有相同的整数类型(有符号或无符号),则具有较小整数转换等级类型的操作数将转换为具有较高等级的操作数的类型。
  • 如果具有无符号整数类型的操作数的秩大于或等于另一个操作数的类型的等级,则带有符号整数类型的操作数将转换为具有无符号整数类型的操作数的类型。
  • 如果带有符号整数类型的操作数的类型可以表示具有无符号整数类型的操作数类型的所有值,则具有无符号整数类型的操作数将转换为带有符号整数类型的操作数的类型。 / LI>
  • 否则,两个操作数都将转换为无符号整数类型,对应于带有符号整数类型的操作数类型。