Печать Длинных Чисел В Mingw/Windows

Тип 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

Вместе с данным постом часто просматривают:

Автор Статьи


Зарегистрирован: 2019-12-10 15:07:06
Баллов опыта: 0
Всего постов на сайте: 0
Всего комментарий на сайте: 0
Dima Manisha

Dima Manisha

Эксперт Wmlog. Профессиональный веб-мастер, SEO-специалист, дизайнер, маркетолог и интернет-предприниматель.