Были небольшие проблемы с придумыванием названия для этого вопроса.
Недавно я погрузился в мир 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
оценивается с типом, определяемым типами его операндов, а не типом, в который преобразуется результат. Приведение операндов кunsigned long long
должно решить проблему. (И окончательное приведение не требуется; присваивание или инициализатор неявно преобразует любое числовое выражение в целевой тип.) - person Keith Thompson   schedule 08.08.2013