Как напечатать тип int64 t в C

стандарт C99 имеет целочисленные типы с размером байтов, например int64_t. Я использую следующий код:

#include <stdio.h>
#include <stdint.h>
int64_t my_int = 999999999999999999;
printf("This is my_int: %I64dn", my_int);

и я получаю это предупреждение компилятора:

warning: format ‘%I64d’ expects type ‘int’, but argument 2 has type ‘int64_t’

Я старался с:

printf("This is my_int: %lldn", my_int); // long long decimal

но я получаю то же самое предупреждение. Я использую этот компилятор:

~/dev/c$ cc -v
Using built-in specs.
Target: i686-apple-darwin10
Configured with: /var/tmp/gcc/gcc-5664~89/src/configure --disable-checking --enable-werror --prefix=/usr --mandir=/share/man --enable-languages=c,objc,c++,obj-c++ --program-transform-name=/^[cg][^.-]*$/s/$/-4.2/ --with-slibdir=/usr/lib --build=i686-apple-darwin10 --program-prefix=i686-apple-darwin10- --host=x86_64-apple-darwin10 --target=i686-apple-darwin10 --with-gxx-include-dir=/include/c++/4.2.1
Thread model: posix
gcc version 4.2.1 (Apple Inc. build 5664)

какой формат следует использовать для печати переменной my_int без предупреждения?

6 ответов


на int64_t тип:

#include <inttypes.h>
int64_t t;
printf("%" PRId64 "\n", t);

на uint64_t тип:

#include <inttypes.h>
uint64_t t;
printf("%" PRIu64 "\n", t);

вы также можете использовать PRIx64 для печати в шестнадцатеричном формате.

cppreference.com имеет полный список доступных макросов для всех типов, в том числе intptr_t (PRIxPTR). Существуют отдельные макросы для scanf, например SCNd64.


типичным определением PRIu16 было бы "hu", поэтому неявная конкатенация строковых констант происходит при компиляции время.

чтобы ваш код был полностью переносимым, вы должны использовать PRId32 и так далее для печати int32_t и "%d" или аналогичный для печати int.


путь C99

#include <inttypes.h>
int64_t my_int = 999999999999999999;
printf("%" PRId64 "\n", my_int);

или вы могли бы бросить!

printf("%ld", (long)my_int);
printf("%lld", (long long)my_int); /* C89 didn't define `long long` */
printf("%f", (double)my_int);

если вы застряли с реализацией C89 (в частности, Visual Studio), вы можете использовать открытый исходный код <inttypes.h><stdint.h>): http://code.google.com/p/msinttypes/


С С99 в %j модификатор длины также может использоваться с семейством функций printf для печати значений типа int64_t и uint64_t:

#include <stdio.h>
#include <stdint.h>

int main(int argc, char *argv[])
{
    int64_t  a = 1LL << 63;
    uint64_t b = 1ULL << 63;

    printf("a=%jd (0x%jx)\n", a, a);
    printf("b=%ju (0x%jx)\n", b, b);

    return 0;
}

компиляция этого кода с gcc -Wall -pedantic -std=c99 не выдает предупреждений, и программа выводит ожидаемый результат:

a=-9223372036854775808 (0x8000000000000000)
b=9223372036854775808 (0x8000000000000000)

это согласно printf(3) в моей системе Linux (на главной странице конкретно говорится, что j используется для обозначения преобразования в intmax_t или uintmax_t; в моем stdint.З, как int64_t и intmax_t есть оператор typedef бы точно так же, и аналогично для uint64_t). Я не уверен, что это идеально переносится на другие системы.


приходит из встроенного мира, где даже uclibc не всегда доступен, и код, как

uint64_t myval = 0xdeadfacedeadbeef; printf("%llx", myval);

печатает вам дерьмо или не работает вообще - я всегда использую крошечный помощник, который позволяет мне правильно сбрасывать uint64_t hex:

#include <stdlib.h>
#include <stdio.h>
#include <stdint.h>

char* ullx(uint64_t val)
{
    static char buf[34] = { [0 ... 33] = 0 };
    char* out = &buf[33];
    uint64_t hval = val;
    unsigned int hbase = 16;

    do {
        *out = "0123456789abcdef"[hval % hbase];
        --out;
        hval /= hbase;
    } while(hval);

    *out-- = 'x', *out = '0';

    return out;
}

в среде windows используйте

%I64d

в Linux, используйте

%lld

/ / VC6.0 (386 и лучше)

    __int64 my_qw_var = 0x1234567890abcdef;

    __int32 v_dw_h;
    __int32 v_dw_l;

    __asm
        {
            mov eax,[dword ptr my_qw_var + 4]   //dwh
            mov [dword ptr v_dw_h],eax

            mov eax,[dword ptr my_qw_var]   //dwl
            mov [dword ptr v_dw_l],eax

        }
        //Oops 0.8 format
    printf("val = 0x%0.8x%0.8x\n", (__int32)v_dw_h, (__int32)v_dw_l);

С уважением.