I was looking into lib/factor/factor_v7.cpp and see code like if (*nrOfLevels < 128). In the comment it says
// use 1 byte per int (Na encoding takes 1 bit)
which seems to be "wasting" the other 7 bits once that one bit is used, technically can support up to 256 distinct values (including NA and NaN).
Without much background, I assume it's to do with how R encodes the values, so it's always stored as int instead of unsigned int. I know if it's too expensive in terms of performance to relax this to 256 by converting to unsigned int. I know Julia supports unsigned with its UInt8 type.