Unsigned integers in Ada have a value range from 0 to some positive number (not necessarily 1 subtracted from some power of 2). They are defined using the mod keyword because they implement a wrap-around arithmetic.
for which also shift and rotate operations are defined. The values of n depend on compiler and target architecture.
You can use range to sub-range a modular type:
But beware: the Modulus of Half_Byte is still 256! Arithmetic with such a type is interesting to say the least.