c 传递 unsigned long long 值

标签 c

一个函数的最后两行怎么可能

printf("disk_free_blocks returning %llu\n",item_int3);
return (item_int3);

和输出

disk_free_blocks 返回 233012428800

返回调用函数

part_avail=disk_free_blocks(DiskParts[part_index].part_name,DISK_AVAIL);
if (DEBUG) printf("DiskParts[%d].part_name=%s has %llu free.\n",part_index,DiskParts[part_index].part_name,part_avail);

输出为

DiskParts[0].part_name=/dev/sda1 有 1084194816 个可用空间。

??

unsigned long long part_avail, item_int3;

最佳答案

两个输出数字是:

0x00000036409F8000

        0x409F8000

返回类型(您尚未显示)似乎不够大,无法容纳 64 位值,因此编译器只是截断(这是标准所需的行为,用于缩小无符号数的转换范围)整数)。

<小时/>

我倾向于认为这些都是错误的:2330 亿个 block ,其中一个 512 字节 block ,即 100 TB。不见得。 10 亿个 block 大约为 512 GB,这可能与您的实际 /dev/sda1 可用空间匹配,也可能不匹配。

unsigned long long part_avail, item_int3;

这是没有意义的,因为这两个变量的使用范围不同。是否有两个同名的变量?或者您使用全局变量吗?

函数内的 item_int3 可能只有 32 位,printf 在 vararg 处理期间读取参数列表的末尾,而堆栈恰好有 0x00000036 ,以便由 %llu 说明符打印出来。当以 unsigned long long 形式返回时,编译器会正确地对值进行零扩展,然后调用者将完整的 64 位值压入堆栈,该值在 printf 期间正确检索并打印 vararg 处理 %llu 格式代码。

关于c 传递 unsigned long long 值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6712244/

相关文章:

计算距离

C - 如何将(来自基于用户的输入)各种字符串存储在结构内的数组中?

C指针错误值?

c - Windows 上的/proc/net/dev 替代方案

c - execl() 不工作/打印

c++ - 加载 QPixmap 数据的更好方法

c - 我该如何调试这个程序?

c - 如何在 Linux 中不安全地删除 block 设备驱动程序

c - 使用 free() 函数

c - 使用 FreeIPMI API 从 IPMI 获取所有 DIMM 信息