ещё с ansi_c_89
3.3.3.4 The sizeof operator
...
The value of the result is implementation-defined, and its type (an
unsigned integral type) is size_t defined in the header.
сказано про unsigned для size_t.
А проблема в ptrdiff_t - типе выражения разности двух указателей.
Разность двух указателей, указывающих в пределах одного объекта (а только для таких разность и определена) - штука знаковая. И если ptrdiff_t - не 32-битный (а это расточительно для 16-битной архитектуры в большинстве реальных случаев), то байтовый массив не может быть больше 32767 байт, иначе найдутся два указателя... А поскольку указатель на любой объект можно привести к указателю на байт - то для всех это ограничение работает. Либо ручками соответствующую модель памяти включить.
В случае с IAR, как я понял данное обсуждение, huge_flash только даёт возможность затолкать массив за границу 64К, но не переводит ptrdiff_t на 32-битовое значение.