3 ms·
"Naturally, sizes should be unsigned because they represent values which cannot be unsigned." Unsigned types in C have modular arithmetic, I think they should
by uecker 1y 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.
- enqk 1y agoyeah 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
- AlotOfReading 1y agoIf you need saturating arithmetic, C23 adds that as well with a new header: https://en.cppreference.com/w/c/header/stdckdint https://en.cppreference.com/w/c/header/stdckdint
- TuxSH 1y agoSo 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.
- deleted 1y ago[deleted]
- uecker 1y agoFor signed types you can can also get a run-time trap on overflow, making it safe to use. Bug caused by unsigned wraparound are extremely hard to find.