gpt4 book ai didi

c++ - 有趣又烦人的整数问题

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:20:46 25 4
gpt4 key购买 nike

所以,我有以下代码,我知道它在某处损坏了,我根本无法确定在哪里...

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 ... google告诉我它是。那么我到底如何才能先得到 2900029440 然后再得到 18446744072314613760 进行相同的计算呢?有人可以向我解释这里发生了什么吗?现在超出​​了我的综合能力,我觉得,这是一个隐藏在某个地方的微小问题...... 4902319 * 4096 不应该是一个如此巨大的数字,应用程序会像这样发疯。 ..

感谢您的帮助!

最佳答案

首先你计算 (4096 * 4902319) ,它被计算为 int 并且它溢出了。然后将该数字转换为 uint64_t

尝试:

(4096 *  (uint64_t) 4902319) 

使其计算为 uint64_t。

关于c++ - 有趣又烦人的整数问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15474062/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com