> The type are [...] size_t which is the unsigned integral type of the result of the sizeof operator
(Emphasis mine.)
1. https://port70.net/~nsz/c/c89/c89-draft.html#4.1.5
> The type size_t is an implementation-defined unsigned integer type that is large enough to contain the size in bytes of any object ([expr.sizeof]).
It's not guaranteed to have a full negative range, only to be able to represent -1.
Use ptrdiff_t as a signed size type.