64-битные целые числа и printf/scanf

eesti keeles | in English

Важная информация для пользователей языка C: считывание и запись 64-битных целых чисел слегка различается в Windows и Linux.

Под Linux (в частности, на сервере тестирования) используется компилятор GCC и реализации функций printf и scanf из библиотеки GNU glibc. В этой библиотеке символом формата для 64-битного целого числа со знаком является %Ld или %lld, а для 64-битного целого числа без знака: %Lu или %llu.

Под Windows (т.е. в большинстве компьютерных классов) используется компилятор GCC/MinGW и реализации функций printf и scanf из библиотеки Microsoft MSVCRT.DLL. В данной библиотеке символом формата для 64-битного целого числа со знаком является %I64d, а для 64-битного целого числа без знака: %I64u.

Для того, чтобы ваше решение корректно работало вне зависимости от среды, рекомендуется реализовать ввод и вывод по нижеуказанному примеру:

    #include <stdio.h>

    #ifdef _WIN32
        /* format-stroki dlya Windows */
        #define LONGLONG "%I64d"
        #define ULONGLONG "%I64u"
    #else
        /* format-stroki dlya Linux */
        #define LONGLONG "%Ld"
        #define ULONGLONG "%Lu"
    #endif

    int main() {
        long long a;
        int b;
        long c;
        unsigned long long d;
        double e;

        /* primer vvoda odinochnogo 64-bitnogo chisla */
        scanf(LONGLONG, &a);
        /* primer vvoda 64-bitnogo chisla vmeste s drugimi dannymi */
        scanf("%d%ld" ULONGLONG "%lf", &b, &c, &d, &e);
        /* primer vyvoda 64-bitnogo chisla */
        printf(LONGLONG "\n", a);
        /* primer vyvoda 64-bitnogo chisla vmeste s drugimi dannymi */
        printf("%d %ld " ULONGLONG " %lf\n", b, c, d, e);

        return 0;
    }

Вышеприведённое замечание относится и к использованию функций printf и scanf в языке C++. Оно однако не касается использования в C++ объектов библиотеки streams (объекты cin, cout и cerr, а также классы ifstream и ofstream).

В языках Pascal, Java и Python разницы в использовании методов ввода-вывода между операционными системами нет.

Lehekülg viimati muudetud December 04, 2014, at 03:09 AM