Я предполагаю, что SIZE_T_BITSIZE
- это число бит в типе size_t
, поэтому сдвиг 1 на SIZE_T_BITSIZE - 1
даст вам (SIZE_MAX + 1) / 2
(математическое) значение. Таким образом, условие проверяет, является ли (size_t)mem - (size_t)fm
больше или равно математическому значению (SIZE_MAX + 1) / 2
.
Это не то же самое, что (int)((size_t)mem - (size_t)fm) < 0
. Кроме того, если mem
и / или fm
приводятся к size_t
, который является типом без знака, арифметика происходит в типах без знака, что означает, что разница не может быть меньше 0. Таким образом, даже если (size_t)mem
меньше (size_t)fm
, (size_t)mem - (size_t)fm
никогда не будет меньше 0. Это равно разнице mem - fm
плюс SIZE_MAX
плюс 1
, что является положительным значением. Преобразование этого значения в int
может привести к переполнению, которое определяется реализацией, или может не переполниться, и в этом случае вы получите положительное значение.
Итак, чтобы ответить на ваш вопрос, если (size_t)mem
меньше (size_t)fm
, у вас, вероятно, ошибка до этой точки.
Что такое m
? Под m
вы имеете в виду mem
?
Редактировать : похоже на ошибку в nedmalloc
, по причинам, которые я упоминал выше. Данный код был закомментирован в последней версии .