2009-05-07 8 views
0

私はボリュームを追跡するために使用する符号なしlong longを持っています。ボリュームは、別の符号なし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

+1

fprintf行に3番目のパラメータがありませんが、誤ってコピーした可能性があります。@Charlieちょうどそれを追加しないでください。私たちが探している問題かもしれません。 @JPM現在のコードは入手したコードですか? vol = 1に設定したときに問題を再現できますか? atoiを使う代わりに? – phihag

+1

彼はそれが負の数をプリントしていると言えば、それは間違ったprintfでなければならないと思う。もしそれが間違っていなければ、%lluは正の数(何かが別の関心事であれ)を出力し、負の数値は出力しません。 –

+0

さて、printfは間違っているかもしれませんが(miscopiedではなく)、atoiもそうです。 –

答えて

0

コードが推測構文エラーがありますが、ここにあるので、まあ、私は本当に言うことはできません。

vol = atoi(voltemp); 

をatoiはasciiを整数に変換します。 atolを試してみるといいかもしれませんが、長い時間ではなく長い時間にしか得られません。

あなたのC標準ライブラリにはatollがありますか?

0

数値がsigned intの範囲を超えることができる場合、atoiを使用することはできません。

EDIT:atoll(これは明らかに標準的です)が示唆しているように、別の良い選択肢です。ちょうどsigned長いあなたに制限することを念頭に置く。実際、最も簡単なオプションは標準でもあるstrtoullです。

+1

アトールはC99だと思いますが、通常はANSI Cの拡張機能として利用できますが、C99でのみ保証されています。 – dreamlax

+0

dreamlax、あなたが正しいように見えます。 –

0

fprintfは、ポインタではなくパラメータとしてlonglongを取ることができますか?

1

strtoullの代わりにatoiを使用する以外は、負の値が表示されるので、何か間違っているはずです。これは、あなたの長さを整数に変換するようです。フォーマット指定子%lluは負の値を出力しません。

強く問題があると思われるのは、fprintfです。 stdio.hが含まれていて、引数リストが実際にソースコードに含まれていることを確認してください。

0

私はprintfが%lluを扱っていないと思うと思います。 おそらくスタックから32ビットしか取られず、64ではなくなります。

%lluはC99以降の標準です。おそらくあなたのコンパイラは%LUが好きですか?

0

説明のため、fprintfステートメントが間違ってコピーされました(私の間違い、申し訳ありません)。 fprintfの文は、実際に読んでください:

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

また、アレイvoltempの確かずさんな最大長はウェル32ビット整数の範囲内にある9バイト(桁)です。

私はプログラムからこのコードを抜き出してテストプログラムで実行しますが、これは私が期待しているのは困惑しています。

+0

この説明は、質問自体の一部として非常に役立ちます。答えとしてここに残すのではなく、質問を編集することを検討してください。 –

0

voltempが本当に大きければ、atoiではなくstrtoullを使用する必要があります。

関連する問題