为什么'l'和'll'修饰符对printf(C)执行相同操作

时间:2016-11-15 01:02:24

标签: c printf long-integer libc

我不理解printf函数的lll长度说明符之间的区别:

printf("%ld \n", 9999999991474836499);
printf("%lld \n", 9999999991474836499);

两个printf的输出相同,因为类型溢出:

-8446744082234715117                                                                                                                                                                                                              
-8446744082234715117

所以当我删除一个数字时,我会这样做:

printf("%ld \n", 999999999147483649);
printf("%lld \n", 999999999147483649);

我得到相同的输出:

999999999147483649                                                                                                                                                                                                                
999999999147483649  

没有溢出。

我不明白l意味着long intll意味着long long int所以为什么它们没有任何区别?

2 个答案:

答案 0 :(得分:3)

在某些计算机上,longlong long具有相同的表示形式,因此lll执行相同的操作。大多数64位平台都是如此,除了Windows。 (这是为什么它以这种方式工作的解释,而不是它必须以这种方式工作的承诺。)

在其他平台上 - 64位Windows,32位任何东西,你都不会那么幸运。

程序不正确,它只是发生偶然工作,并且无法保证它会继续工作,即使在同一平台上也是如此。

答案 1 :(得分:1)

“%ld”无法保证处理64位整数。 “%lld”是。

在C库的许多实现中,没有区别,但某些平台可能无法使用%ld打印大型64位数字