Pull to refresh

Вывод long long чисел в Mingw/Windows

Reading time1 min
Views1.4K
Тип 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 знаков, выравнивание по правому краю, заполнение пустых позиций нулями) выглядит так:

stringstream stream;
string str;
long long number = 1234LL;

stream.flags(ios::right);
stream.fill( '0' );
stream.width( 10 );

stream << number;
stream >> str;


результат: str == «0000001234»;
Tags:
Hubs:
Total votes 2: ↑2 and ↓0+2
Comments0

Articles