3

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

编辑:谢谢大家。我看到没有类型转换。后缀u(如10u)也是如此吗?那么这些l和有什么用u呢?

4

5 回答 5

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
    
  • 海湾合作委员会(3.4.5):

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

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

                i is -2147483648, j is -2147483648
    

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

  • 编译器错误
  • 操作数提升中的 C90 与 C99 规则(“ long long”支持是 C99,但其中一些编译器可能会使用“ long long”作为扩展名来编译 C90)
  • 实现定义的行为
  • 未定义的行为

FWIW,MSVC 和 Comeau 的行为符合我的预期——这可能会让很多人感到惊讶。第一次操作的逻辑(在我看来)是:

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

第二个操作的逻辑是:

  • -2147483647被标记为 ' -' 和2147483647
  • 2147483647是一个有符号整数
  • 减去1结果,-2147483648因为表示该数字没有问题
  • 将其转换为 long long 不会改变符号。
于 2009-09-29T15:07:29.327 回答
1

大多数现代编译器应该足够聪明,可以看到您将文字分配给 a long,并将生成该类型的文字,而不是强制进行预分配转换。

于 2009-09-28T03:31:05.407 回答
1

可以肯定的是,如果完全按照说明编写,它将等价于 i = 1l; 任何转换都将在编译时完成。

但是,如果你写

long i = (unsigned int)-1;

那么我可能不会是你所期望的。

于 2009-09-28T03:37:28.933 回答
0

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

于 2009-09-28T03:31:57.273 回答
-1

编译器将看到您尝试分配的内容并立即将值设置为 1。文字不会发生类型转换。即使您说 long x = 1.0,您也不会看到运行时类型转换。

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

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

于 2009-09-28T03:37:46.247 回答