想出这个问题的标题会有点麻烦.
我最近偶然发现了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);
Run Code Online (Sandbox Code Playgroud)
在我做GDB的时候:
p (fsStat.f_bsize * fsStat.f_blocks)
Run Code Online (Sandbox Code Playgroud)
结果是1335205888但是在计算完成后,当我这样做时
p totalByes
Run Code Online (Sandbox Code Playgroud)
结果是18446744071562067968
任何可能让我知道在这里尝试什么的信息都会非常棒.以前认为我知道如何编程,直到我开始做多平台C :(
假设:
乘法溢出,因此fsStat.f_bsize * fsStat.f_blocks产生溢出结果-2147483648.当它被转换unsigned long long为时,它产生了18446744071562067968,这是0xffffffff80000000,结果是以64位无符号格式包装-2147483648.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(from <stdint.h>)或平台提供的类型(某些Linux标头)更好地处理磁盘大小.