整数溢出

时间:2009-05-07 21:49:13

标签: c overflow

我有一个用于跟踪音量的无符号长音。该卷增加另一个无符号长整数。每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版本下运行

7 个答案:

答案 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