SizeOf Оператор: ...
«Значение из результатом является реализация-de Нед и его тип (целое число без знака типа) является size_t, де определено в < stddef.h> (и другие заголовки) «. - стандарт C99.
Конверсии: ...
«В противном случае, если операнд, который имеет беззнаковое целое число типа имеет ранг больше или равен рангу типа другого операнда, то операнд с подписью целочисленного типа преобразуется в тип операнда с целым типом без знака. " - стандарт C99.
int d (-1) преобразуется в тип (TOTAL_ELEMENTS-2), который является sizeof возвращаемым типом (целое число без знака). Обычно это делается путем переинтерпретации битов как unsigned value => -1 signed integer = 0xFFFFFFFF (если int имеет 32 бита) беззнаковое целое число.
Вы пытаетесь сравнить 0xFFFFFFFF с 0x5 (TOTAL_ELEMENTS-2), который является ложным.
Вы должны иметь предупреждение ... подписан/без знака несоответствие ...
C99 standard
'TOTAL_ELEMENTS' без знака (например, без знака долго долго),' D <= (TOTAL_ELEMENTS-2) 'сравнивается как без знака. – BLUEPIXY