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

0

voltempが本当に大きい場合はstrtoull、ではなくを使用する必要がありますatoi

于 2009-05-09T01:38:09.630 に答える
0

問題は、 printf が %llu をあなたが思っているように処理していないことだと思います。おそらく、スタックから 64 ビットではなく 32 ビットしか取っていません。

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

于 2009-05-07T22:15:42.473 に答える
0

あなたのコードには構文エラーがあるため、よくわかりませんが、推測は次のとおりです。

vol = atoi(voltemp);

atoi は ascii を整数に変換します。あなたはatolを試してみたくなるかもしれませんが、それは長いものではなく、長いものになるだけです。

C 標準ライブラリには toll が含まれている可能性があります

于 2009-05-07T21:53:17.363 に答える
0

明確にするために、 fprintf ステートメントが間違ってコピーされました (私のミスです、申し訳ありません)。fprintf ステートメントは実際には次のようになります。

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

また、確かにずさんですが、配列 voltemp の最大長は 9 バイト (桁) であり、32 ビット整数の制限内に収まっています。

このコードをプログラムから取り出してテスト プログラムで実行すると、予想通りの不可解な結果が得られます。

于 2009-05-08T02:04:21.377 に答える
0

数値が signed int の境界を超える可能性がある場合は、atoi を使用できません。

編集:提案されているように、環礁(明らかに標準です)は別の良いオプションです。signedそれはあなたを長い長いものに制限することに注意してください. 実際、最も単純なオプションはstrtoullで、これも標準です。

于 2009-05-07T21:58:33.793 に答える
0

fprintf は longlong へのポインターではなく、パラメーターとして受け取ることができますか? longlong を渡す前に int に変換しているようです。

于 2009-05-07T21:59:47.300 に答える