だから、私は次のコードを持っています、私はそれがどこかで壊れていることを知っています、そして私は単にどこを特定することができません...
static uint64_t get_disk_total(const char* path)
{
struct statvfs stfs;
if ( statvfs(path, &stfs) == -1 )
{
return 0;
}
uint64_t t = stfs.f_blocks * stfs.f_bsize;
std::cout << "total for [" << path << "] is:" << t
<< " block size (stfs.f_bsize):" << stfs.f_bsize
<< " block count (stfs.f_blocks):" << stfs.f_blocks
<< " mul:" << stfs.f_blocks * stfs.f_bsize
<< " hardcoded: " << (uint64_t)(4096 * 4902319) // line 50
<< std::endl ;
return t;
}
コンパイルすると、次のように表示されます。
part_list.cpp: In function ‘uint64_t get_disk_total(const char*)’:
part_list.cpp:50:59: warning: integer overflow in expression [-Woverflow]
良い。実行すると、結果は次のようになります (手動で改行を追加):
total for [/] is:2900029440
block size (stfs.f_bsize):4096
block count (stfs.f_blocks):4902319
mul:2900029440
hardcoded: 18446744072314613760
私は知ってい4902319 * 4096 = 20079898624
ます...グーグルはそれが私に教えてくれます。では、どうやって最初に取得し2900029440
、次に18446744072314613760
同じ計算を行うのでしょうか? 誰かがここで何が起こっているのか説明してもらえますか? 現時点では、私の包括的な能力を超えており、これはどこかに隠された小さな小さな問題だと感じています...4902319 * 4096
アプリケーションがこのように狂ってしまうほど大きな数になるべきではありません...
ご協力ありがとうございました!