此答案试图说明为什么需要LL。 (这并不容易。)
其他答案已经说明了为什么需要括号。
我们来编写三个宏,都是十进制常量。
#define MAXILL (9223372036854775807LL)
#define MAXIL (9223372036854775807L)
#define MAXI (9223372036854775807)
即使MAXI 没有后缀,也不能使其类型为int。 MAXI 将具有它适合的第一个类型,int、long、long long 或扩展整数类型。
即使MAXIL 有L 后缀,它也会有它适合的第一个类型,long、long long 或扩展整数类型。
即使MAXILL 有LL 后缀,它也会有它适合的第一个类型,long long 或扩展整数类型。
在每种情况下,宏都具有相同的值,但可能类型不同。
有关类型确定,请参阅 C11dr §6.4.4.1 5。
让我们尝试打印它们,int 和 long 是 32 位的,long long 和 intmax_t 是 64 位。
printf("I %d %d %d", MAXI, MAXIL, MAXILL); //Error: type mismatch
printf("LI %ld %ld %ld", MAXI, MAXIL, MAXILL); //Error: type mismatch
printf("LLI %lld %lld %lld", MAXI, MAXIL, MAXILL); //Ok
最后一行中的三个都是正确的,因为所有三个宏都是long long,前面的格式说明符和数字之间的类型不匹配。
如果我们有 int 是 32 位,long、long long 和 intmax_t 是 64,那么以下是正确的。
printf("LI %ld %ld", MAXI, MAXIL);
printf("LLI %lld", MAXILL);
最大宽度整数类型的格式说明符为"%" PRIdMAX。此宏无法扩展为"%ld" 和 "%lld" 以容纳MAXI, MAXIL, MAXILL。它设置为"%lld",并且与intmax_t 相关的数字需要具有相同的类型。在这种情况下,应该使用long long 并且只能使用MAXILL 形式。
其他实现可能具有扩展的整数类型(如int128_t),在这种情况下,可以使用实现特定的后缀或某种机制。