Re:Ask HN: Good practices for my first C project
by gavinhoward on Wednesday October 18, 2023 @04:47PM
(#37934549)
One of the reasons I recommend unsigned arithmetic is because you can make checked arithmetic from it. Doing it with signed arithmetic is a fool's errand.
I have, in fact, done this.
Re:Ask HN: Good practices for my first C project
by jcranmer on Wednesday October 18, 2023 @04:55PM
(#37934640)
It is best not to try to roll your own checked arithmetic. Your compiler already has an implementation, that will likely compile down to "check the overflow flag in hardware", and carries 0 risk of undefined behavior. Why not use it?
("It's not portable" is a reason that will cease to be true shortly--as mentioned, C23 added checked overflow functions.)
Re:Ask HN: Good practices for my first C project
by gavinhoward on Wednesday October 18, 2023 @05:02PM
(#37934717)
Because I want to stay on C11.
> Your compiler already has an implementation
That's a big assumption that is not true on all compilers I want to target.
Re:Ask HN: Good practices for my first C project
by yjftsjthsd-h on Thursday October 19, 2023 @12:13AM
(#37938293)
> ("It's not portable" is a reason that will cease to be true shortly--as mentioned, C23 added checked overflow functions.)
So in practice, today, it's not portable and won't be for a while (even when it's released into compilers, it'll take time for those new versions to trickle into the ecosystem), which is a compelling argument against using it.
I would recommend against this. You're trading off one form of incorrect behavior (UB) for another form of incorrect behavior (wraparound on overflow is incorrect >99% of the time), with the added potential for mistakes in the emulation step.
Instead, do this:
* If you consider that wraparound on overflow is in fact the correct and desired behavior, use unsigned arithmetic.
* If you want to check for overflowing conditions, use your compiler's builtins for checked operations (C23 finally adds ckd_* ops, but it's too new to recommend use of yet).