64-bitised täisarvud ja printf/scanf

по-русски | in English

Teadmiseks C kasutajatele: 64-bitiste täisarvude lugemine ja kirjutamine on Windowsi ja Linuxi all veidi erinev.

Linuxi all (testimisserveris) kasutab GCC funktsioonide printf ja scanf realisatsioone GNU teegist glibc ja seal on 64-bitise märgiga täisarvu tunnuseks %Ld või %lld ja 64-bitise märgita täisarvu tunnuseks %Lu või %llu.

Windowsi all (enamuses arvutiklassides) kasutab GCC/MinGW funktsioonide printf ja scanf realisatsioone Microsofti teegist MSVCRT.DLL ja seal on 64-bitise märgiga täisarvu tunnuseks %I64d ja 64-bitise märgita täisarvu tunnuseks %I64u.

Selleks, et teie lahendus töötaks õigesti mõlemas keskkonnas, on kõige kasulikum vormistada sisend-väljund alltoodud näite eeskujul:

    #include <stdio.h>

    #ifdef _WIN32
        /* tunnused Windowsi jaoks */
        #define LONGLONG "%I64d"
        #define ULONGLONG "%I64u"
    #else
        /* tunnused Linuxi jaoks */
        #define LONGLONG "%Ld"
        #define ULONGLONG "%Lu"
    #endif

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

        /* loeme 64-bitise arvu eraldi */
        scanf(LONGLONG, &a);
        /* loeme 64-bitise arvu teiste andmetega koos */
        scanf("%d%ld" ULONGLONG "%lf", &b, &c, &d, &e);
        /* kirjutame 64-bitise arvu eraldi */
        printf(LONGLONG "\n", a);
        /* kirjutame 64-bitise arvu teiste andmetega koos */
        printf("%d %ld " ULONGLONG " %lf\n", b, c, d, e);

        return 0;
    }

Eeltoodu kehtib ka printf ja scanf kasutamisel C++ programmides, kuid ei puuduta C++ streams-teegi (objektid cin, cout ja cerr ning klassid ifstream ja ofstream) kasutajaid.

Pascali, Java ja Pythoni sisend-väljundoperatsioonid töötavad Linuxi all samamoodi kui Windowsi all.

Lehekülg viimati muudetud October 13, 2016, at 03:01 PM