c: unsigned long long 仅在 HP-UX 上被分配了错误的值

标签 c hp-ux

想出这个问题的标题有点麻烦。

我最近摸索着进入了 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/

相关文章:

c - 奇怪的堆栈溢出?

shell - 执行脚本后如何恢复 shell 提示符

c - 标识符 "snprintf"未定义

c - 在 HP-UX 11.00 中,什么会导致应用程序报告来自 .sl 库的 undefined symbol __shlinit?

c - 在C中的一个字节中存储2个十六进制字符

c - 错误 C2106 : '=' left operand must be l-value

c - 如何发明平方根代码?

c - malloc,它如何分配地址?

unix - 如何使find返回hpux中符号链接(symbolic link)的目标?

c - 在 Hp-UX ksh 中执行交互式命令(意外)并获取子进程