Тип long long появился в стандарте c99. В 32х-битных архитектурах размер этого типа равен 64 бита. В стандарте вводится строка форматирования printf-подобных функций для этого типа: %lld (%llu для беззнаковых).
Но как часто бывает, написанное просто по справочникам не всегда работает. Столкнувшись с необходимостью перекомпилировать свой код при помощи MinGW/GCC, (который как казалось бы должен обеспечивать совместимость и переносимость кода между GNU/Linux и windows платформами) обнаружил, что поведение данного типа существенно отличалось от описанного: число выводилось как 32-битное.
Выяснилось, что MinGW использует вызовы к функциям windows. Ну а windows, как известно, заботится об обратной совместимости со старыми версиями: при появлении нового стандарта они не стали приводить функции в соответствие с ним, а продолжили использовать для этого типа нестандартную строку форматирования: %I64d. Вот соответствующая страница в мсдн, описывающая это — никаких %lld.
Но несмотря на это, в Visual Studio 2005 %lld обрабатывается нормально, а в MinGW, использующем функции windows — нет.
Короче, вуду-программирование
Итог:
Как хорошо, что если использовать стандартные классы С++ вместо C-функций, то таких проблем не возникает. Решение для вывода в строку числа в виде 0000001234 (10 знаков, выравнивание по правому краю, заполнение пустых позиций нулями) выглядит так:
результат: str == «0000001234»;
Но как часто бывает, написанное просто по справочникам не всегда работает. Столкнувшись с необходимостью перекомпилировать свой код при помощи MinGW/GCC, (который как казалось бы должен обеспечивать совместимость и переносимость кода между GNU/Linux и windows платформами) обнаружил, что поведение данного типа существенно отличалось от описанного: число выводилось как 32-битное.
Выяснилось, что MinGW использует вызовы к функциям windows. Ну а windows, как известно, заботится об обратной совместимости со старыми версиями: при появлении нового стандарта они не стали приводить функции в соответствие с ним, а продолжили использовать для этого типа нестандартную строку форматирования: %I64d. Вот соответствующая страница в мсдн, описывающая это — никаких %lld.
Но несмотря на это, в Visual Studio 2005 %lld обрабатывается нормально, а в MinGW, использующем функции windows — нет.
Короче, вуду-программирование
Итог:
Как хорошо, что если использовать стандартные классы С++ вместо C-функций, то таких проблем не возникает. Решение для вывода в строку числа в виде 0000001234 (10 знаков, выравнивание по правому краю, заполнение пустых позиций нулями) выглядит так:
stringstream stream;
string str;
long long number = 1234LL;
stream.flags(ios::right);
stream.fill( '0' );
stream.width( 10 );
stream << number;
stream >> str;
результат: str == «0000001234»;