Если Visual C ++ 2008 возвращает 18
для std::numeric_limits<unsigned long long>::digits10
, это ошибка (у меня не установлен Visual C ++ 2008 для проверки описанного поведения).
В Visual C ++ (по крайней мере для 32-разрядных и 64-разрядных Windows) unsigned long long
является 64-разрядным целочисленным типом без знака и способен представлять все целые числа от нуля до 18 446 744 073 709 551 615 (2 64 - 1).
Следовательно, правильное значение для digits10
здесь равно 19, поскольку unsigned long long
может представлять 9 999 999 999 999 999 999 (19 цифр), но не может представлять 99 999 999 999 999 999 999 (20 цифр).То есть он может представлять каждое 19-значное число, но не каждое 20-значное число.
При компиляции с Visual C ++ 2010 ваша программа печатает ожидаемое значение 19.