尝试285212672ULL
;如果你没有后缀编写它,你会发现编译器将它视为一个常规整数。它在变量中工作的原因是因为该整数在赋值中被转换为unsigned long long
,所以传递给printf()
的值是正确的类型。
而且我可以告诉大家,不,编译器可能不足够聪明,在printf()
格式字符串从"%llu
“看着办吧。这是一个不同的抽象级别,编译器是负责语言的语法,printf()
语义是不是语法的一部分,它是一个运行时库函数(没有从自己的职能不同的真正不同之处在于它包含在标准)。
考虑下面的代码为32位int和64位无符号long long系统:
#include <stdio.h>
int main (void) {
printf ("%llu\n",1,2);
printf ("%llu\n",1ULL,2);
return 0;
}
,其输出:
8589934593
1
在第一种情况中,两个32位整数1和2被压入堆栈和printf()
解释,作为一个单一的64位ULL值,2×2 + 1. 2
参数正被无意中包含在ULL值中。
第二,你实际上推64位1值和一个多余的32位整数2
,这被忽略。
请注意,您的格式字符串和实际参数之间的“步调不一致”是一个坏主意。喜欢的东西:
printf ("%llu %s %d\n", 0, "hello", 0);
可能崩溃,因为32位"hello"
指针将由%llu
和%s
消耗会尝试去参考最终0
说法。下面的“图片”说明了这一点(让我们假设单元格是32位,并且“hello”字符串存储在0xbf000000。
What you pass Stack frames What printf() uses
+------------+
0 | 0 | \
+------------+ > 64-bit value for %llu.
"hello" | 0xbf000000 |/
+------------+
0 | 0 | value for %s (likely core dump here).
+------------+
| ? | value for %d (could be anything).
+------------+
,但我认为编译器足够聪明弄清楚%U在printf格式规范,尝试printf(“%d%u”,〜0,〜0)..都将按预期打印值。 – sud03r 2009-09-06 19:18:51
否 - 这些数据类型的大小相同 - 它是printf() %d与'a'。 – paxdiablo 2009-09-06 22:43:26
Pax:这也很好,字符文字是整数常量。 – caf 2009-09-07 01:26:58