@@ -146,25 +146,35 @@ size_t Print::print(unsigned int n, int base) {
146146}
147147
148148size_t Print::print (long n, int base) {
149- if (base == 0 ) {
150- return write (n);
151- } else if (base == 10 ) {
152- if (n < 0 ) {
153- int t = print (' -' );
154- n = -n;
155- return printNumber (n, 10 ) + t;
156- }
157- return printNumber (n, 10 );
158- } else {
159- return printNumber (n, base);
149+ int t = 0 ;
150+ if (base == 10 && n < 0 ) {
151+ t = print (' -' );
152+ n = -n;
160153 }
154+ return printNumber (static_cast <unsigned long >(n), base) + t;
161155}
162156
163157size_t Print::print (unsigned long n, int base) {
164- if (base == 0 )
158+ if (base == 0 ) {
159+ return write (n);
160+ }
161+ return printNumber (n, base);
162+ }
163+
164+ size_t Print::print (long long n, int base) {
165+ int t = 0 ;
166+ if (base == 10 && n < 0 ) {
167+ t = print (' -' );
168+ n = -n;
169+ }
170+ return printNumber (static_cast <unsigned long long >(n), base) + t;
171+ }
172+
173+ size_t Print::print (unsigned long long n, int base) {
174+ if (base == 0 ) {
165175 return write (n);
166- else
167- return printNumber (n, base);
176+ }
177+ return printNumber (n, base);
168178}
169179
170180size_t Print::print (double n, int digits) {
@@ -233,6 +243,18 @@ size_t Print::println(unsigned long num, int base) {
233243 return n;
234244}
235245
246+ size_t Print::println (long long num, int base) {
247+ size_t n = print (num, base);
248+ n += println ();
249+ return n;
250+ }
251+
252+ size_t Print::println (unsigned long long num, int base) {
253+ size_t n = print (num, base);
254+ n += println ();
255+ return n;
256+ }
257+
236258size_t Print::println (double num, int digits) {
237259 size_t n = print (num, digits);
238260 n += println ();
@@ -258,9 +280,29 @@ size_t Print::printNumber(unsigned long n, uint8_t base) {
258280 base = 10 ;
259281
260282 do {
261- unsigned long m = n;
283+ char c = n % base;
284+ n /= base;
285+
286+ *--str = c < 10 ? c + ' 0' : c + ' A' - 10 ;
287+ } while (n);
288+
289+ return write (str);
290+ }
291+
292+ size_t Print::printNumber (unsigned long long n, uint8_t base) {
293+ char buf[8 * sizeof (long long ) + 1 ]; // Assumes 8-bit chars plus zero byte.
294+ char * str = &buf[sizeof (buf) - 1 ];
295+
296+ *str = ' \0 ' ;
297+
298+ // prevent crash if called with base == 1
299+ if (base < 2 )
300+ base = 10 ;
301+
302+ do {
303+ char c = n % base;
262304 n /= base;
263- char c = m - base * n;
305+
264306 *--str = c < 10 ? c + ' 0' : c + ' A' - 10 ;
265307 } while (n);
266308
0 commit comments