如果我写“ long i = 1;
”而不是“ long i = 1l;
”,是否会1
被识别为int
然后隐式转换为long
?
编辑:谢谢大家。我看到没有类型转换。后缀u
(如10u
)也是如此吗?那么这些l
和有什么用u
呢?
如果我写“ long i = 1;
”而不是“ long i = 1l;
”,是否会1
被识别为int
然后隐式转换为long
?
编辑:谢谢大家。我看到没有类型转换。后缀u
(如10u
)也是如此吗?那么这些l
和有什么用u
呢?
常量的类型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
我还不确定如何解释这些差异。它可能是以下一项或多项:
long long
”支持是 C99,但其中一些编译器可能会使用“ long long
”作为扩展名来编译 C90)FWIW,MSVC 和 Comeau 的行为符合我的预期——这可能会让很多人感到惊讶。第一次操作的逻辑(在我看来)是:
-2147483648
被标记为 ' -
' 和2147483648
2147483648
是一个无符号整数(因为它不适合一个整数 - 我相信这在 C99 中是不同的)-
' 运算符2147483648
再次导致第二个操作的逻辑是:
-2147483647
被标记为 ' -
' 和2147483647
2147483647
是一个有符号整数1
结果,-2147483648
因为表示该数字没有问题大多数现代编译器应该足够聪明,可以看到您将文字分配给 a long
,并将生成该类型的文字,而不是强制进行预分配转换。
可以肯定的是,如果完全按照说明编写,它将等价于 i = 1l; 任何转换都将在编译时完成。
但是,如果你写
long i = (unsigned int)-1;
那么我可能不会是你所期望的。
今天的编译器将识别它并生成相同的结果。
编译器将看到您尝试分配的内容并立即将值设置为 1。文字不会发生类型转换。即使您说 long x = 1.0,您也不会看到运行时类型转换。
顺便说一句,在 Windows 上,long 和 int 是相同的,所以无论如何都不会有类型转换。
[编辑:对 Windows 进行了最后的评论;删除了对预处理器的引用]