先看第一段代码:
#include <stdio.h>
int main(void)
{
long long ll = 4096 * 1024 * 1024;
FILE * fp = fopen("E:\\result.txt", "w");
fprintf(fp, "I64d = %I64d, d = %d\n", ll, ll);
if (100 < ll)
{
fprintf(fp, "100 < ll");
}
else
{
fprintf(fp, "100 >= ll");
}
fclose(fp);
return 0;
}
输出 结果 :
I64d = 0, d = 0
100 >= ll
从上面的结果来看,不论使用I64d的格式,还是普通的%d格式,输出结果都是0.推断 ll == 0。fprintf打印的 100 >= ll也从侧面印证了这一点。
为什么ll会等于0?
猜测是不能一口气计算4096 * 104 * 1024,这样一来,得数刚好超过32位整数的表述范围
改为:
#include <stdio.h>
int main(void)
{
long long ll = 4096;
ll = ll * 1024 * 1024;
FILE * fp = fopen("E:\\result.txt", "w");
fprintf(fp, "I64d = %I64d, d = %d\n", ll, ll);
if (100 < ll)
{
fprintf(fp, "100 < ll");
}
else
{
fprintf(fp, "100 >= ll");
}
fclose(fp);
return 0;
}
结果 :
I64d = 4294967296, d = 0
100 < ll
可见
1)I64d计算是要注意;
2)要用%I64d输出64位数,不能用%d