我在以下计划中做错了什么?
代码
#include <stdio.h>
int main()
{
long x=1290323123123;
int len = snprintf(NULL,0, "%ld", x);
printf("%ld %ld",x,len);
return 0;
}
输出: 1832934323 10
答案 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
之类的引入我不认为(名称,大小)对有一个标准。