我有一个用于跟踪音量的无符号长音。该卷增加另一个无符号长整数。每5秒我打印一次该值,当值达到32位无符号最大值时,printf给出一个负值。代码段如下:
unsigned long long vol, vold;
char voltemp[10];
vold = 0;
...后来
while (TRUE) {
vol = atoi(voltemp);
vold += vol;
fprintf(fd2, "volume = %llu);
}
我做错了什么?这在RedHat 4 2.6.9-78.0.5.ELsmp gcc 3.4.5版本下运行
答案 0 :(得分:1)
由于您说它打印了一个负值,除了使用atoi
而不是strtoull
之外,还有其他错误。 %llu
格式说明符不会打印负值。
问题似乎是fprintf
调用。检查您是否包含stdio.h
,并且参数列表确实是源代码中的内容。
答案 1 :(得分:0)
嗯,我无法说出因为你的代码有语法错误,但这是一个猜测:
vol = atoi(voltemp);
atoi将ascii转换为整数。您可能想尝试atol,但这只会让它变长,而不是很长。
你的C标准库可能有atoll。
答案 2 :(得分:0)
如果数字超出signed int的范围,则不能使用atoi。
编辑:atoll(显然是标准的),如建议的那样,是另一个不错的选择。请记住,将您限制为signed
很长时间。实际上,最简单的选项是strtoull,这也是标准的。
答案 3 :(得分:0)
你确定fprintf可以接受longlong作为参数,而不是指向它的指针吗?看起来它在传入之前将你的longlong转换为int。
答案 4 :(得分:0)
我猜测问题是printf没有像你想象的那样处理%llu。 它可能只从堆栈中取出32位,而不是64位。
%llu仅是C99以来的标准。也许你的编译器更喜欢%LU?
答案 5 :(得分:0)
为了澄清,fprintf语句被错误地复制了(我的错误,抱歉)。 fprintf语句实际上应该是:
fprintf(fd2, "volume = %llu\n", vold);
此外,虽然不可否认,数组voltemp的最大长度是9个字节(数字),这完全在32位整数的范围内。
当我将这段代码从程序中拉出来时,它是一部分并在测试程序中运行它我得到了我期望的结果令人费解。
答案 6 :(得分:0)
如果voltemp
非常大,则需要使用strtoull
,而不是atoi
。