0

我有一个 unsigned long long 用于跟踪音量。音量增加另一个 unsigned long long。每 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 下运行

4

7 回答 7

1

既然您说它打印的是负值,那么除了您使用 ofatoi而不是之外,肯定还有其他问题strtoull。格式说明%llu符只是不打印负值。

看起来问题出在fprintf电话上。检查您是否包含stdio.h以及参数列表确实是源代码中的内容。

于 2009-05-07T22:06:40.793 回答
0

好吧,我真的不能说,因为你的代码有语法错误,但这里有一个猜测:

vol = atoi(voltemp);

atoi 将 ascii 转换为整数。您可能想尝试atol但这只会让它变得很长,而不是很长。

您的 C 标准库可能有atoll

于 2009-05-07T21:53:17.363 回答
0

如果数字可以超过有符号整数的范围,则不能使用 atoi。

编辑:如建议的那样,环礁(显然是标准的)是另一个不错的选择。请记住,这限制了你的signed长。实际上,最简单的选项是strtoull,这也是标准的。

于 2009-05-07T21:58:33.793 回答
0

您确定 fprintf 可以将 longlong 作为参数而不是指向它的指针吗?看起来它正在将您的 longlong 转换为 int 在传递之前。

于 2009-05-07T21:59:47.300 回答
0

我猜问题是 printf 没有像你想象的那样处理 %llu 。它可能只从堆栈中取出 32 位,而不是 64 位。

%llu 是自 C99 以来的唯一标准。也许您的编译器更喜欢 %LU?

于 2009-05-07T22:15:42.473 回答
0

为了澄清 fprintf 语句被错误地复制(我的错误,对不起)。fprintf 语句实际上应该是:

 fprintf(fd2, "volume = %llu\n", vold);

此外,虽然不可否认,数组 voltemp 的最大长度是 9 个字节(数字),这完全在 32 位整数的范围内。

当我将这段代码从程序中提取出来并在测试程序中运行时,我得到了我期望的结果,这令人费解。

于 2009-05-08T02:04:21.377 回答
0

如果voltemp真的很大,您将需要使用strtoull,而不是atoi

于 2009-05-09T01:38:09.630 回答