Or you could just convert from the unsigned to the signed type, rather than dragging unions into it.
This conversion doesn't have undefined behavior; it produces an implementation defined result.
C programs can simulate two's complement math using unsigned types, avoiding UB. Then rely on IB to convert between signed and unsigned.
Not always, but overflows are usually bugs. This is replicated finding of dynamic overflow checking tools, over and over.
You can store the angle as a union of signed and unsigned type. Do arithmetic on the unsigned member, where overflow is defined. (Both members are equivalent angles)