为什么这个程序会截断输出?

时间:2010-11-10 18:20:37

标签: c

我在以下计划中做错了什么?

代码

    #include <stdio.h>
int main()
{
long x=1290323123123;
int len = snprintf(NULL,0, "%ld", x);

printf("%ld  %ld",x,len);

 return 0;
}

输出: 1832934323 10

2 个答案:

答案 0 :(得分:6)

1290323123123要求存储41位,但long可能只有32位长,因此额外的9位消失了。

1290323123123 = 0x12c6d405bb3
                  ^^^
                  excessive data that is chopped off

              =    0x6d405bb3

              = 1832934323

使用

#include <inttypes.h>
#include <stdint.h>
#include <stdio.h>

int main () {
    int64_t x = 1290323123123LL;
//  ^^^^^^^                  ^^
    int len = snprintf(NULL, 0, "%"PRId64, x);
//                                ^^^^^^^
    printf("%"PRId64" %d\n", x, len);
//           ^^^^^^^^
    return 0;
}

确保类型至少为64位长,因此它可以完全存储该值(结果:http://www.ideone.com/BnTjJ)。

答案 1 :(得分:2)

你的'long'类型只能容纳4个字节。您为“x”指定的值大于4个字节。

Hex(1290323123123) = 12C 6D40 5BB3
Hex(1832934323 ) = 6D40 5BB3 

因此,它输出的数字与您尝试打印的数字的低4字节相同。

某些编译器可能有更大的'long'类型 - 在C99之前和类型int64_t之类的引入我不认为(名称,大小)对有一个标准。