c передача беззнакового длинного длинного значения - PullRequest
0 голосов
/ 15 июля 2011

Как последние две строки одной функции могут быть

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 ]

5 голосов
/ 15 июля 2011

Два выходных числа:

0x00000036409F8000

и

        0x409F8000

Похоже, что тип возвращаемого значения (который вы не показали) недостаточно велик для размещения64-битное значение, поэтому компилятор просто усекает (что является стандартным поведением для сужения преобразований в целых числах без знака).


Я склонен считать, что оба они неправильны: 233 миллиарда блоков,с 512-байтовым блоком, то есть 100 ТБ.Скорее всего, не.1 миллиард блоков составляет около 512 ГБ, что может соответствовать или не соответствовать вашему фактическому /dev/sda1 свободному пространству.

unsigned long long part_avail, item_int3;

Это не имеет смысла, поскольку использование этихдве переменные находится в разных областях применения.Есть ли две переменные с одинаковыми именами?Или вы используете глобальные переменные?

Возможно, item_int3 внутри функции составляет всего 32 бита, printf читает после конца списка аргументов во время обработки vararg, и в стеке просто оказалось 0x00000036на нем, так что это было напечатано спецификатором %llu.Когда возвращается как unsigned long long, компилятор должным образом обнуляет значение, а затем вызывающая сторона помещает полное 64-битное значение в стек, который извлекается и печатается правильно во время обработки printf vararg формата %lluкод.

1 голос
/ 15 июля 2011

Возвращаемое значение было усечено до 32 бит где-то по пути. Возможно, disk_free_blocks объявлен как возвращающий int?

0 голосов
/ 18 июля 2011

RESOLVED

disk_free_blocks() находился в файле, отличном от process_copy_out(), функция вызывала disk_free_blocks.

Исправлено добавление прототипа функции для информирования компилятора,

Спасибо всем за помощь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...