想出这个问题的标题有点麻烦。
我最近摸索着进入了 C 的世界。
我有一些代码基本上可以显示驱动器的容量和可用空间。它在我尝试过的几个不同的 Linux 发行版以及 Solaris 和 AIX 上运行良好。我最近在 HP-UX PA-RISC 机器上编译并得到(在我看来)一个非常奇怪的错误。
struct statfs fsStat;
err = statfs(rootPath,&fsStat);
unsigned long long totalBytes = (unsigned long long)(fsStat.f_bsize * fsStat.f_blocks);
在 GDB 中,当我这样做时:
p (fsStat.f_bsize * fsStat.f_blocks)
结果是1335205888 但是在计算运行之后,当我这样做的时候
p totalByes
结果是18446744071562067968
如果有任何信息甚至可以让我了解在此处尝试什么,那将是非常棒的。曾经以为我知道如何编程,直到我开始做多平台 C :(
最佳答案
假设:
乘法溢出,所以fsStat.f_bsize * fsStat.f_blocks
产生了 -2147483648 的溢出结果。当这被转换为 unsigned long long
,它产生了 18446744071562067968,即 0xffffffff80000000,是将 -2147483648 包装成 64 位无符号格式的结果。 GDB 使用与 C 不同的算法,因此它显示了数学上正确的结果。
要解决此问题,请更改 (unsigned long long) (fsStat.f_bsize * fsStat.f_blocks)
至 (unsigned long long) fsStat.f_bsize * fsStat.f_blocks
, 在乘法之前转换为更宽的整数格式。
优于unsigned long long
将使用 uint64_t
(来自 <stdint.h>
)或平台提供的类型(某些 Linux header )用于处理磁盘大小。
关于c: unsigned long long 仅在 HP-UX 上被分配了错误的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18132990/