Suggested replacement for Print::printNumber()

    n /= base;
    char c = m - base * n;

Grr. Pisses me off that the division routine almost certainly already computed the remainder, and then threw it away, requiring us to compute it again!

I have not dumped the assembly listing to see why.

I ran into this recently. It's because signed divide is implemented as a sign fixup function that calls unsigned divide. If your sketch doesn't use the signed divide anywhere else, your binary will be left with only the unsigned divide function (additionally saving the size of the sign-fixup wrapper.)