c传递unsigned long long值

时间:2011-07-15 19:32:31

标签: 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;

3 个答案:

答案 0 :(得分:5)

两个输出数字是:

0x00000036409F8000

        0x409F8000

似乎返回类型(你没有显示)不足以容纳64位值,因此编译器只是截断(这是标准所要求的行为,用于缩小无符号的转换)整数)。


我倾向于认为这些都是错误的:233亿块,512字节块,即100 TB。不见得。然后,10亿个块大约为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格式代码。

答案 1 :(得分:1)

沿途某处将返回值截断为32位。也许disk_free_blocks被声明为返回int

答案 2 :(得分:0)

分辨

disk_free_blocks()位于与process_copy_out()不同的文件中,该函数调用disk_free_blocks

修复程序添加了一个函数原型来通知编译器。

谢谢大家的帮助。