Если у вас возникли проблемы с заголовком для этого вопроса.c: unsigned long long присваивается неправильное значение только для HP-UX
Недавно я полезла в мир С.
У меня есть немного кода, который в основном показывает емкость и свободное пространство на диске. Он отлично работает на нескольких разных дистрибутивах 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
Любая информация, которая может даже дать мне представление о том, что попробовать здесь, будет rea очень здорово. Используется думать, что я знал, как программировать, пока я не начал делать мульти платформу C :(
В большинстве случаев тип выражения C (который определяет условия, в котором он будет переполняться) определяется самим выражением, а не контекстом, в котором он появляется. 'fsStat.f_bsize * fsStat.f_blocks' оценивается с типом, определяемым типами его операндов, а не типом, в который преобразуется результат. Приведение операндов к 'unsigned long long' должно устранить проблему. (И окончательный отбор не нужен, назначение или инициализатор неявно преобразует любое числовое выражение в целевой тип.) –
Спасибо за ваш комментарий. Вы помогли мне лучше понять, как обрабатывается инструкция. Теперь я осознаю ошибку в том, что она завершает умножение в парензисе, что приводит к значению этого типа (которое в этом случае переполнено). Первоначально у меня не было ни броска, ни оценки, и он просто пытался это сделать. Ваше решение было правильным и теперь имеет для меня гораздо больше смысла. Спасибо. –