You write code for the compiler. You write comments for humans. As simple as that.
I rarely disagree with you, but this time I do.
You write code for both humans, and compiler; I'd even say human first. Good compilers are
designed to consume code written for humans, so there usually is no conflict here at all; good code works for both.
If one finds oneself "outsmarting" the human reader to "satisfy" the compiler all the time, then this is probably due to wrong assumptions (i.e., trying to write "portable assembler C" or "obfuscated C" and
assuming it compiles into more efficient binary, without ever checking). Some ideas of "efficient C" can be also decades old, and worked with compilers of 1980-1990's.
Only rarely you have to prioritize the compiler over human reader. In such cases, comments are of course of utmost importance. But generally, I would recommend using comments to document the ideas (why do something the way it's done, how it was done before, why it was changed, what to consider in the future...), and let the code itself document the trivial "what it does" part.
Many features serve both human readers and compilers well. For example, uint_fast8_t communicates the required range of
at least 0..255 and the fact larger range can be used
if it provides performance gains. Both compiler and human reader consumes this information, and because it's standardized since C99, human reader does not need to remember project-specific conventions.