Тип long long появился в стандарте c99. В 32-битных архитектурах размер этого типа составляет 64 бита.
Стандарт вводит строку форматирования для функций, подобных printf, для этого типа: %lld (%llu для беззнаковых).
Но, как это часто бывает, то, что написано просто по справочникам, не всегда работает. Столкнувшись с необходимостью перекомпилировать свой код с помощью MinGW/GCC (который, казалось бы, должен обеспечивать совместимость и переносимость кода между GNU/Linux и платформами Windows), я обнаружил, что поведение этого типа существенно отличается от описанного: число выводилось как 32-битное.
Оказалось, что MinGW использует вызовы функций Windows. Ну а Windows, как известно, заботится об обратной совместимости со старыми версиями: когда появился новый стандарт, они не стали приводить функции в соответствие с ним, а продолжали использовать нестандартную строку формата для этого типа: %I64d. Здесь соответствующая страница в msdn , описывая это - нет %lld. Но, несмотря на это, %lld нормально обрабатывается в Visual Studio 2005, а не в MinGW, который использует функции Windows. Короче говоря, программирование вуду.
Результат:
Хорошо, что если вместо функций C использовать стандартные классы 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;
результат: ул == "0000001234";
Теги: #C++ #mingw #long long #standards #Chulan