将“长i = 1;”导致C中的隐式类型转换?

时间:2009-09-28 03:25:55

标签: c implicit-typing

如果我写“long i = 1;”而不是“long i = 1l;”,1是否会被识别为int,然后会隐式转换为long?< / p>

编辑:谢谢大家。我看到没有类型转换。后缀为u(如10u)的情况也是如此吗?那么lu的用途是什么?

5 个答案:

答案 0 :(得分:3)

常量1的类型是int,所以从技术上讲,类型转换将完成,但它将在编译时完成,不会丢失任何内容。

但是,请考虑更有趣的例子:

int main(void)
{
    long long i = -2147483648;
    long long j = -2147483647 - 1;

    printf( " i is %lld, j is %lld\n", i, j);

    return(0);
}

我从各种编译器得到以下结果:

  • MSCV 9(版本15.00.21022.08):

                i is 2147483648, j is -2147483648
    
  • GCC(3.4.5):

                i is -2147483648, j is 0
    
  • Comeau(4.3.10.1):

                i is 2147483648, j is -2147483648
    
  • 数字火星:

                i is -2147483648, j is -2147483648
    

我不确定如何解释差异。它可能是以下一个或多个:

  • 编译器错误
  • C90与操作数升级中的C99规则(“long long”支持是C99,但其中一些编译器可能正在编译C90,并以“long long”作为扩展名
  • 实施定义的行为
  • 未定义的行为

FWIW,MSVC和Comeau的行为是我的预期 - 这是许多人可能仍会感到惊讶的事情。第一个操作的逻辑(在我看来)是:

  • -2147483648被标记为“-”和2147483648
  • 2147483648是一个unsigned int(因为它不适合int - 我相信这在C99中是不同的)
  • 由于无符号算术规则,
  • 应用一元“-”运算符会再次导致2147483648
  • 将其转换为long long不会改变符号。

第二个操作的逻辑是:

  • -2147483647被标记为“-”和2147483647
  • 2147483647是签名的int
  • 1中减去-2147483648,因为表示该数字没有问题
  • 将其转换为long long不会改变符号。

答案 1 :(得分:1)

大多数现代编译器应该足够智能,以确保您将文字分配给long,并且会生成该类型的文字,而不是强制进行预分配转换。

答案 2 :(得分:1)

非常确定,如果完全按照规定书写,则相当于i = 1l; 任何转换都将在编译时完成。

但是,如果你写

long i =(unsigned int)-1;

然后我可能不会达到你的预期。

答案 3 :(得分:0)

今天的编译器会识别它并生成相同的结果。

答案 4 :(得分:-1)

编译器将看到您要分配的内容并立即将值设置为1。文字没有类型转换。即使你说长x = 1.0,你也不会看到运行时类型转换。

顺便说一句,在Windows上,long和int是相同的,所以无论如何都不会进行类型转换。

[编辑:特定于Windows的最后评论;删除了对预处理器的引用]