Because for most usages they act just like regular types! Note that the
change in behavior that I described is not "dramatically" different than
for normal types, sizeof just returns a type that can express fractions
of a "byte" and defines math the make this work as normal.
Remember, the original question was how to make an implementation that
allowed for a type that was smaller than char. This method keeps totally
conforming behavior for programs that do not use this feature, and
mostly the expected result when using the feature.
Yes, it would be possible based on this logic to make an implementation
that did something totally weird when using a type like _Nybble, but
then, based on the standard that IS allowed. It should only be done with
an implementation that has provided a useful meaning to this form of
undefined behavior.
Explicit use of _Nybble can have arbitrarily weird consequences, because
it's a reserved name, so your code can't define it itself, and because
most uses of an identifier that has no definition are constraint
violations. That's not the case which justifies bothering to explicitly
allow for extended integer types.
The case which does matter is if an extended integer type is used by the
implementation for one of the standard things that can be typedefs for
an integer type, such as size_t. Using a size_t that's a typedef for an
extended integer type does not have undefined behavior (at least, not
for that reason), and must have behavior consistent with the
requirements of the standard. Which rules out, among other things,
having sizeof() behave as oddly as you suggests it could, if used on
that typedef. If used directly on the extended type, there's no problem,
but when used on the standard typedef, it must behave normally. It must
do all the things that the standard requires of a type suitable for use
as the corresponding typedef.
If it weren't for the sizeof() issue, _Nybble could obviously meet the
requirements for
int4_t, int_least4_t, and int_fast4_t. Less
obviously, it could also meet the requirements for clock_t, fpos_t.
time_t, though selecting it for any of those purposes would render the
corresponding features of C nearly useless.