如果我写“long i = 1;
”而不是“long i = 1l;
”,1
是否会被识别为int
,然后会隐式转换为long
?< / p>
编辑:谢谢大家。我看到没有类型转换。后缀为u
(如10u
)的情况也是如此吗?那么l
和u
的用途是什么?
答案 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
我不确定如何解释差异。它可能是以下一个或多个:
long long
”支持是C99,但其中一些编译器可能正在编译C90,并以“long long
”作为扩展名FWIW,MSVC和Comeau的行为是我的预期 - 这是许多人可能仍会感到惊讶的事情。第一个操作的逻辑(在我看来)是:
-2147483648
被标记为“-
”和2147483648
2147483648
是一个unsigned int(因为它不适合int - 我相信这在C99中是不同的)-
”运算符会再次导致2147483648
第二个操作的逻辑是:
-2147483647
被标记为“-
”和2147483647
2147483647
是签名的int 1
中减去-2147483648
,因为表示该数字没有问题答案 1 :(得分:1)
大多数现代编译器应该足够智能,以确保您将文字分配给long
,并且会生成该类型的文字,而不是强制进行预分配转换。
答案 2 :(得分:1)
非常确定,如果完全按照规定书写,则相当于i = 1l; 任何转换都将在编译时完成。
但是,如果你写
long i =(unsigned int)-1;
然后我可能不会达到你的预期。
答案 3 :(得分:0)
今天的编译器会识别它并生成相同的结果。
答案 4 :(得分:-1)
编译器将看到您要分配的内容并立即将值设置为1。文字没有类型转换。即使你说长x = 1.0,你也不会看到运行时类型转换。
顺便说一句,在Windows上,long和int是相同的,所以无论如何都不会进行类型转换。
[编辑:特定于Windows的最后评论;删除了对预处理器的引用]