Comment by uecker
11 hours ago
"Naturally, sizes should be unsigned because they represent values which cannot be unsigned."
Unsigned types in C have modular arithmetic, I think they should be used exclusively when this is needed, or maybe if you absolutely need the full range.
So do signed types (guaranteed to be 2's complement since C23, though all sane targets have been using that representation for a long time).
Two's complement encodes -x as ~x + 1 = 2^n - x = -x (mod 2^n) and can therefore be mixed with unsigned for (+, -, *, &, |, ^, ~, <<).
> I think they should be used exclusively when this is needed
The opposite: signed type usage should be kept to a minimum because signed type (and pointer) overflow is UB and will get optimized as such.
yeah unsigned are really about opting to perform modular arithmetic, or for mapping hardware registers.
C is weakly typed, the basic types are really not to maintain invariants or detect their violation
If you need saturating arithmetic, C23 adds that as well with a new header: https://en.cppreference.com/w/c/header/stdckdint