Блог пользователя riadwaw

Автор riadwaw, 11 лет назад, По-русски

Кажется, в текущих версиях C++ компиляторов, абсолютно правильно работает %lld, в том числе, совпадая с %I64d

Мне кажется, стоит убрать предупреждение, мешающее отправлять такие решения и не добавлять спойлеры в задачах, о том, что нужен ввод/вывод 64-битных чисел.

Код


#include <stdio.h> int main() { long long x = 1ll << 60; printf("%lld %I64d\n", x, x); printf("%d %d %d\n", sizeof(int), sizeof(long), sizeof(long long)); printf("%d %d\n", sizeof(double), sizeof(long double)); return 0; }

Посылки в случайную задачу:

3143024 3143022 3143006

  • Проголосовать: нравится
  • +65
  • Проголосовать: не нравится

»
11 лет назад, # |
  Проголосовать: нравится +6 Проголосовать: не нравится

И это даже не оптимизатор постарался. В более содержательном случае тоже все работает. 3143216

  • »
    »
    11 лет назад, # ^ |
      Проголосовать: нравится +35 Проголосовать: не нравится

    Тем не менее, даже если на отдельно взятом Codeforces всё работает — в жюришных решениях и чекерах всё равно ещё несколько лет придётся писать через #define для совместимости с теми местами, где они могут быть скомпилированы.

»
11 лет назад, # |
  Проголосовать: нравится +1 Проголосовать: не нравится

Насколько мне известно, %lld/%lli был пофиксен с Windows 7+. В них gcc кидает warning'и но работает корректно.

»
11 лет назад, # |
Rev. 2   Проголосовать: нравится +10 Проголосовать: не нравится

Ввиду того, что эта тема недавно снова всплыла, я потестил последний MinGW (GCC 4.7.2) и получил такие результаты:

  • На Windows 8 %lld работает всегда
  • На Windows 7 %lld работает всегда
  • На Windows XP %lld работает не всегда:
    • с gcc -std=c99 работает
    • с g++ не работает
    • с g++ -std=c++11 работает

Так что не всё так хорошо, как казалось бы.