I always that the best argument, that every assembly programmer knows, that starting at i=0 allow i to be used as an offset from the base address of an array. I bet that's why K&R choose this for C (unlike Wirth for Pascal which allowed any index range for arrays).
This makes the most sense to me if you look at it backwards. Given that array access starts with zero, what do you call the access parameter? If you call it "offset" from the beginning of the array, then starting at zero makes sense. If you call it "index", or "element", then we have this confusion. The problem to me isn't the choice of the numbering scheme, it is the names and explanation around it.
Which makes sense that it's offset for C, but higher level languages like Python, JS, etc should be index based, which would be 1. That's where R, Julia, Matlab get it right.
Actually Niklaus Wirth did the best thing a long time ago with Pascal ... let the programmer decide the index range for arrays (although he screwed up making the size of the array part of the type). K&R made the best decision for C since it is the most transparent for the hardware.
<sarcasm>
We should also teach children to start counting at 0 instead of 1. While we're at it, tell them that we only have 8 fingers (not 10), and thus octal would be the conventional base and we can use our thumbs for carry and overflow bits.
</sarcasm>
Yes, it is possible to convert from any numeric base to any other numeric base.
Why is 2 so special? Is it more important for humans to be able to calculate quantities in their head, or to be able to convert to obscure computer formats?
Of course you can convert between any two bases. It's trivial to convert between bases that are a power of two. I don't know of a trivial way to convert between base 12 and base 2. 2 is very special to computers -- that's the base they use.
> We should also teach children to start counting at 0 instead of 1
We do, not when they're starting out but the number line is introduced pretty early to children. Even earlier we teach them to count backwards with zero being the final element. Kids aren't strangers to the concept of zero.
Indeed, and this is also consistent with C being closer to the metal than Pascal. At a hardware level, a typical implementation for array access was to have a base pointer plus an index, where the base pointer points to the start of the array, and the index is the element number. I got used to zero based arrays thanks to assembly language, long before learning C.
I don't know if this is still the case -- my understanding of microprocessor architecture is about 30 years old.