Два выходных числа:
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
код.